2012-10-22 68 views
0

我试着在Cygwin下编译一个dll文件,该文件是通过dlltool使用foo.def文件创建的.a文件。在DEF文件,我可以看到register_callback存在:使用dlltool --def foo.def --output-lib libfoo.a创建g ++抱怨'_register_callback'的未定义引用

EXPORTS 
    ... 
    register_callback @7569 
    ... 

的某文件。

但是,当链接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不会有所作为。

任何指针解决这个问题将不胜感激。

回答

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

应该

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

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

+0

明天我会回到办公室试试看! –