__declspec(dllimport)の正しい使い方

私は2つのdllをビルドしたいと思い、それらを Foo Bar と呼ぶことができます。私は、 Bar Foo から何らかのクラスをインポートしたいと考えています。

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'

EXPORTが定義されていない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

宣言されている関数を定義することはできません。

Bar Foo を参照する方法を教えてください。

2
MSVC ++では __ declspec(dllexport)ではありませんか?
追加された 著者 Seth Carnegie,
ああ、MinGWがそれをサポートしているか分からなかった。
追加された 著者 Seth Carnegie,
@SethCarnegie私はMinGWを使用しています
追加された 著者 javagrendel,

1 答え

Bar.dll をビルドするときは、 -l <​​/ code>オプションで Foo.lib

3
追加された
@javagrendel ..これは、より多くの情報を持っています transmissionzero.co.uk/computing /ビルド-dlls-with-mingw
追加された 著者 parapura rajkumar,
技術的には、OPがgccを使用しているので、 Foo.lib libFoo.dll.a です。同じことですが、別のコンパイラのファイル形式は異なります。
追加された 著者 thiton,
Foo.libをビルドするにはどうすればいいですか?
追加された 著者 javagrendel,