我正在尝试编译依赖于gtkspell的东西,这取决于附魔,在MinGW下.我遇到的错误就像
gtkspell/gtkspell.c:757: undefined reference to '_imp__enchant_broker_init'
我怀疑这是因为我在尝试连接一个{静态,动态}库时,我应该链接到另一个,或者因为在imp之前只有一个下划线应该有两个; 我明白了
$ objdump -t /d/opt/enchant-1.6.0/lib/libenchant.a | grep enchant_broker_init
[ 85](sec 1)(fl 0x00)(ty 20)(scl 2) (nx 0) 0x00002ac0 _enchant_broker_init
Run Code Online (Sandbox Code Playgroud)
和
$ objdump -t /d/opt/enchant-1.6.0/lib/libenchant.dll.a | grep enchant_broker_init
[ 6](sec 1)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x00000000 _enchant_broker_init
[ 7](sec 3)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x00000000 __imp__enchant_broker_init
Run Code Online (Sandbox Code Playgroud)
互联网(http://lists.freedesktop.org/archives/gstreamer-devel/2007-January/013975.html)表明,盗版来自于
_declspec(dll{import,export})
Run Code Online (Sandbox Code Playgroud)
虽然附魔似乎有用
__declspec(dll{import,export})
Run Code Online (Sandbox Code Playgroud)
并且注释掉enchant.h中的相关行会使gtkspell.c请求enchant_broker_init而不是_imp__enchant_broker_init,但不会更改libenchant中显示的符号.有没有办法让gcc不会破坏名称,或者是否有人对可能出现的问题/如何修复它有什么想法?
这是一个在我的系统上重现问题的最小例子:
如果我有一个包含内容的文件enchanttest1.c
#include <stdio.h>
#include <enchant.h>
int main()
{
#ifdef ENCHANT_MODULE_EXPORT
printf("\nEnchant found\n");
#else
printf("\nEnchant not found\n");
#endif
return 0;
}
Run Code Online (Sandbox Code Playgroud)
和包含内容的文件enchanttest2.c
#include <stdio.h>
#include <enchant.h>
int main()
{
EnchantBroker *b = enchant_broker_init();
#ifdef ENCHANT_MODULE_EXPORT
printf("\nEnchant found\n");
#else
printf("\nEnchant not found\n");
#endif
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然后
gcc enchanttest1.c `pkg-config --cflags enchant` && ./a.exe
Run Code Online (Sandbox Code Playgroud)
Enchant found但是给了
gcc enchanttest2.c `pkg-config --cflags enchant` && ./a.exe
Run Code Online (Sandbox Code Playgroud)
给
C:\Users\JASONG~1\AppData\Local\Temp\ccyDLptc.o:testenchant.c:(.text+0xf): undefined reference to `_imp__enchant_broker_init'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
修复我的最小例子的方法是添加--libsafter --cflags; gcc无法找到要链接的库.
我能够通过传递LDFLAGS="$(pkg-config --cflags --libs gtkspell-2.0 enchant)" CFLAGS="$(pkg-config --cflags --libs gtkspell-2.0 enchant)"给configure脚本来解决我最初尝试编译的更复杂代码(gummi(http://dev.midnightcoding.org/projects/gummi))所遇到的问题.问题似乎是gcc的参数以错误的顺序传递,并且在尝试链接gtkspell时无法找到附魔.