0

foo.defファイルを使用してdlltoolを介して作成された「.aファイル」を使用してCygwinでdllをコンパイルしてみました。.defファイルでは、次のことがわかりregister_callbackます。

EXPORTS
    ...
    register_callback @7569
    ...

.aファイルは。を使用して作成されましたdlltool --def foo.def --output-lib libfoo.a

ただし、main.oファイルをリンクすると、g++は_register_callbackが未定義であると文句を言います。 main.o:main.cpp:(.text+0x6e): undefined reference to '_register_callback'

g++ -shared -lfoo -o plugin.dll main.o

nm libfoo.a | grep 'register_callback'ショー:

00000000 b .bss$lazy_iregister_callback
00000000 r .rdata$lazy_iregister_callback
00000000 b __imp__register_callback
00000000 T _register_callback
00000000 b .bss$lazy_iunregister_callback
00000000 r .rdata$lazy_iunregister_callback
00000000 b __imp__unregister_callback
00000000 T _unregister_callback

-lfooの有無にかかわらず、違いはありません。

この問題を解決するための指針をいただければ幸いです。

4

1 に答える 1

3
g++ -shared -lfoo -o plugin.dll main.o

する必要があります

g++ -shared -o plugin.dll main.o -lfoo

つまり、ライブラリを指定するリンカフラグをコマンドライン呼び出しの最後に移動します。これは、新しいバージョンのGCC(GNUツールチェーンではなく)で必要です。これはld、シンボルが相互に依存するのと同じ順序でファイルが指定されることを想定しているためです。

于 2012-10-22T06:34:00.110 に答える