tworzenie dll i includowanie wlasnych plików

0

Witam.
Chcę w CodeBlock napisać własną dll, korzystając z szablonu potrafię napisać prostą bibliotekę, jednak nie potrafię tego zrobić kiedy chcę wykorzystać funkcję z zewnętrznych plików

W tym przypadku chcę skompilować dll z funkcją feed_layer(). Co robię źlę?

||=== Build: Release in test (compiler: GNU GCC Compiler x64) ===|
C:\Users\xXx\Desktop\Błażej\AHK\Projects\neural network 0.2\dll\test\main.h|22|error: expected initializer before 'feed_layer'|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

// main.h
#ifndef __MAIN_H__
#define __MAIN_H__

#include <windows.h>
/*  To use this exported function of dll, include this header
 *  in your project.
 */

#ifdef BUILD_DLL
    #define DLL_EXPORT __declspec(dllexport)
#else
    #define DLL_EXPORT __declspec(dllimport)
#endif


#ifdef __cplusplus
extern "C"
{
#endif

void DLL_EXPORT SomeFunction(const LPCSTR sometext);
float DLLIMPORT feed_layer(t_layer* layer,matrixR* input,f dot);
#ifdef __cplusplus
}
#endif

#endif // __MAIN_H__

// main.cpp
#include "main.h"
#include "nn.h"

// a sample exported function
void DLL_EXPORT SomeFunction(const LPCSTR sometext)
{
    MessageBoxA(0, sometext, "DLL Message", MB_OK | MB_ICONINFORMATION);
}

extern "C" DLL_EXPORT BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
            // attach to process
            // return FALSE to fail DLL load
            break;

        case DLL_PROCESS_DETACH:
            // detach from process
            break;

        case DLL_THREAD_ATTACH:
            // attach to thread
            break;

        case DLL_THREAD_DETACH:
            // detach from thread
            break;
    }
    return TRUE; // succesful
}

// nn.h
#ifndef _NN_
#define _NN_

#include <stdint.h>


typedef void (*f)(uint8_t,uint8_t,uint8_t,int,int,int,float,float*,int,float*,int,float,float*,int);

struct matrixR
{
    uint32_t rowsN;
    uint32_t colsN;
    float* matrix;
};
enum CBLAS_TRANSPOSE {
   CblasNoTrans=111,
   CblasTrans=112,
   CblasConjTrans=113,
   AtlasConj=114
};
struct t_layer
{
    uint32_t type;
    uint32_t aFunction;
    matrixR* weights;
    matrixR* net;
    matrixR* out;
    matrixR* weightsR;
    matrixR* outT01;
};


float  feed_layer(t_layer* layer,matrixR* input,f dot);

#endif // _NN_

// nn.cpp
#include "nn.h"
#define _dot(tA,A,tB,B,C ,alpha,beta) dot(101,tA,tB,C->rowsN,C->colsN,tA==CblasNoTrans?A->colsN:A->rowsN,alpha,A->matrix,A->colsN,B->matrix,B->colsN,beta,C->matrix,C->colsN);

float feed_layer(t_layer* layer,matrixR* input,f dot){
    uint32_t type = layer->type;
//    for(int i=0;i<1000;i++)
    {
        switch(type){
            case 0: // FF
                _dot(CblasNoTrans,input,CblasNoTrans,layer->weights,layer->net,1,0);
            break;
            case 1: // RNN
                _dot( CblasNoTrans , input         , CblasNoTrans , layer->weights  , layer->net  ,1,0);
                _dot( CblasNoTrans , layer->outT01 , CblasNoTrans , layer->weightsR , layer->net  ,1,0);
                break;
        }
    }

    return type;
}

1

DLLIMPORT
Co to i gdzie jest zdefiniowane?

Czy deklaracje dllexport/import są potrzebne w definicjach funkcji? Wydawało mi się, że to zbędne.

2

Te deklaracje

void DLL_EXPORT SomeFunction(const LPCSTR sometext);
float DLLIMPORT feed_layer(t_layer* layer,matrixR* input,f dot);

są otoczone przez scope z extern "C"
ergo implementacje tych funkcji, muszą być poprzedzone przez: extern "C"

extern "C" powoduje to, że C++ name mangling jest wyłączony, żeby można było łatwo znaelść funkcję po nazwie.
name mangling dekoruje nazwy funkcji, by był możliwy ovearoading funkcji. W C ovearloading funkcji jest niedostępny.

0

oczywiście zamiast DLLIMPORT ma być DLL_EXPORT, jest to literówka po wielu nieudanych próbach z przykładów z internetu. Po zmianie i dodaniu include nn.h do main.h zaczyna się kompilować ale funkcja w pliku dll jest niedostępna, jedyne co działa to kiedy ciało funkcji przeniosę do main.cpp ale tego właśnie chcę uniknąć.

co do reszty to nie potrafię odpowiedzieć na te pytania.

0

W pliku .h masz funkcję feed_layer wewnątrz bloku extern "C", a w pliku .cpp jest poza tym blokiem ani nie ma deklaracji extern "C". Jest więc to inna funkcja.

1 użytkowników online, w tym zalogowanych: 0, gości: 1