web-dev-qa-db-ja.com

_imp __ *への未定義の参照を修正するにはどうすればよいですか?

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
11
Jason Gross

私の最小限の例を修正する方法は、--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をリンクしようとしたときにエンチャントが見つからなかったことにあるようです。

7
Jason Gross