2つのDLLを作成したい場合は、Foo
とBar
と呼ぶことができます。 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と宣言された関数は定義できないため、意味があります。
Foo
をBar
にどのように参照する必要がありますか?
と
Foo.lib
とリンクする必要があるBar.dll
を構築 'MSVCのための' __declspec(のdllexport)ではありません++? –@SethCarnegie私はMinGWを使用しています – javagrendel
ああ、MinGWがそれをサポートしているか分かりませんでした。 –