g ++抱怨对'_register_callback'的未定义引用

时间:2012-10-22 06:29:04

标签: c++ c linker cygwin

我尝试使用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没有什么区别。

任何有关解决此问题的建议都将受到赞赏。

1 个答案:

答案 0 :(得分:3)

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

应该是

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

我。即将指定库的链接器标志移动到命令行调用的末尾。这是较新版本的GCC(而不是GNU工具链)所必需的,因为ld现在希望文件是以符号相互依赖的相同顺序指定。