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 回答