MinGWの下で、エンチャントに依存するgtkspellに依存するものをコンパイルしようとしています。 gtkspell/gtkspell.c:757: undefined reference to '_imp__enchant_broker_init'
のようなエラーが発生します。これは、他のライブラリに対してリンクする必要があるときに{static、dynamic}ライブラリに再度リンクしようとしているためか、1つしかないためと思われます。インプの前にアンダースコアを付けます。2つあるはずです。私は得る
$ 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
そして
$ 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
インターネット(http://lists.freedesktop.org/archives/gstreamer-devel/2007-January/013975.html)は、インプマングリングが
_declspec(dll{import,export})
エンチャントは使っているようですが
__declspec(dll{import,export})
、および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;
}
および内容を含むファイル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;
}
その後
gcc enchanttest1.c `pkg-config --cflags enchant` && ./a.exe
Enchant found
を与えますが、
gcc enchanttest2.c `pkg-config --cflags enchant` && ./a.exe
与える
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
私の最小限の例を修正する方法は、--libs
の後に--cflags
を追加することです。 gccは、リンク先のライブラリを見つけることができませんでした。
LDFLAGS="$(pkg-config --cflags --libs gtkspell-2.0 enchant)" CFLAGS="$(pkg-config --cflags --libs gtkspell-2.0 enchant)"
を渡すことで、最初にコンパイルしようとしていたより複雑なコード(gummi(http://dev.midnightcoding.org/projects/gummi))で発生していた問題を修正することができました。 configureスクリプトへ;問題は、gccへの引数が間違った順序で渡され、gtkspellをリンクしようとしたときにエンチャントが見つからなかったことにあるようです。