2011-12-19 2 views
2

Я хочу построить 2 dlls, позвонит им Foo и Bar. Я хочу, чтобы Bar импортировал некоторый класс из Foo.Правильное использование __declspec (dllimport)

foo.h:

#ifdef EXPORT 
#define DECL __declspec(dllexport) 
#else 
#define DECL __declspec(dllimport) 
#endif 

class DECL Foo { 
public: 
     Foo(); 
     void bar(); 
}; 

Bar.cpp:

#include "bar.h" 
void bar(){ 
     Foo f; 
     f.bar(); 
} 

Чтобы построить foo.dll, я

g++ -DEXPORT -c Foo.cpp -o Foo.o 
g++ -shared Foo.o -o Foo.dll 

Это дает следующие ссылки в foo.o :

$ nm Foo.o 
00000000 b .bss 
00000000 d .data 
00000000 i .drectve 
00000000 t .text 
0000000c T __ZN3Foo3barEv 
00000006 T __ZN3FooC1Ev 
00000000 T __ZN3FooC2Ev 

Теперь, когда я хочу построить Bar.dll, я

$ g++ -shared Bar.cpp -o Bar.dll 
/tmp/ccr8F57C.o:Bar.cpp:(.text+0xd): undefined reference to `__imp___ZN3FooC1Ev' 
/tmp/ccr8F57C.o:Bar.cpp:(.text+0x1a): undefined reference to `__imp___ZN3Foo3barEv' 

Если я пытаюсь построить foo.cpp с ЭКСПОРТА не определен (так что макрос DECL вычисляет __declspec (DllImport), я получаю следующее:

$ g++ -c Foo.cpp 
Foo.cpp:3: warning: function 'Foo::Foo()' is defined after prior declaration as dllimport: attribute ignored 
Foo.cpp: In constructor `Foo::Foo()': 
Foo.cpp:3: warning: function 'Foo::Foo()' is defined after prior declaration as dllimport: attribute ignored 
Foo.cpp: In member function `void Foo::bar()': 
Foo.cpp:7: warning: function 'void Foo::bar()' is defined after prior declaration as dllimport: attribute ignored 

, который имеет смысл, поскольку функция, объявленная dllimport, не может быть определена.

Как я могу ссылаться на Foo в Bar?

+0

Не '__declspec (dllexport)' для MSVC++? –

+0

@SethCarnegie Я использую MinGW – javagrendel

+0

Ах, не знал, что MinGW поддерживает это. –

ответ

3

При создании Bar.dll вы также должны связать против Foo.lib с -l опцией

+0

Хорошо, как мне создать Foo.lib? – javagrendel

+0

@javagrendel .. У этого есть больше информации http://www.transmissionzero.co.uk/computing/building-dlls-with-mingw/ –

+0

Технически, поскольку OP использует gcc, 'Foo.lib' называется' libFoo.dll.a'. То же самое, но другой формат файла для другого компилятора. – thiton

Смежные вопросы