2011-12-19 38 views
2

2つのDLLを作成したい場合は、FooBarと呼ぶことができます。 FooからいくつかのクラスをインポートするにはBarが必要です。__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.oの中に次の参照を生成

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

、私はFoo.dllを構築するには:

$ 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を構築したいとき、私は(マクロDECLは、私が手)DLLIMPORT(__declspecと評価されるように定義されていないEXPORTとFoo.cppを構築しようとした場合

は今、私は

$ 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' 

を行います

$ 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と宣言された関数は定義できないため、意味があります。

FooBarにどのように参照する必要がありますか?

+0

Foo.libとリンクする必要があるBar.dllを構築 'MSVCのための' __declspec(のdllexport)ではありません++? –

+0

@SethCarnegie私はMinGWを使用しています – javagrendel

+0

ああ、MinGWがそれをサポートしているか分かりませんでした。 –

答えて

3

あなたはまた-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

関連する問題