2012-04-23 16 views
1

gccではなくclangを使ってGTK +プログラムをコンパイルしました。これまでのところ、私はldリンクを正しく持つことができません。ldが文句を言う:関数 "_start"で、 "__libc_csu_fini"& "__libc_csu_init"への未定義参照

このように、リンクを行うためにはgccと呼ば

オリジナルメイク:

のgcc -g -O2 -export-ダイナミック-o my_application somefile.o another.o -pthread -lgnomeui-2 -lSM -lICE - ボルボボイ-2-アミノメチル-2-フルオロメチル-2-プロパノール-2-アミノ-2-プロパノール - ボランボ-2-活性化-lORBit-2 -lart_lgpl_2 -lgconf-2 -lglade-2.0 -lgtk-x11-2.0 -lgdk-x11 -2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lrt -lglib-2.0 -lxml2 -pthread -lgstreamer-0.10 -lgobject-2.0 -lgmodule-2.0 -lxml2 -lgthread-2.0 -lrt -lglib-2.0

私は単純に上記のコマンドで打ち鳴らすgccのに置き換えた場合、私は後者からこの警告が出ます:

打ち鳴らす:警告:コンパイル時の引数未使用:「-e XPORT-ダイナミック」

問題:clangはリンカオプションとして「-export-dynamic」を認識しないため、ldには渡されません。これにより、外部関数への参照が廃止されます。最後のバイナリが実行されると、メニューオプションもボタンも反応しません。

gccとの最終的なリンクステップを実行すると、バイナリは完全に機能します(実際にはclangでコンパイルされ、gccはリンクのみを行います)。私はgccを自分のマシンで完全に置き換えようとしているので、これは受け入れられません。

LD /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o -g -O2 -export-ダイナミックmy_applicationのsomefileという:

は、だから私はこれを試してみました.o another -o -o -lgnomeui-2 -lSM -lICE -lbonoboui-2 -lgnomevfs-2 -lgnomecanvas-2 -lgnome-2 -lpopt -lbonobo-2 -lbonobo-activation -lORBit-2 -lart_lgpl_2 -lgconf- 2 -lglade-2.0 -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject- 2.0 -lgmodule-2.0 -lgthread-2.0 -lrt -lglib-2.0 -lxml2 -lgstreamer-0.10 -lgobject-2.0 -lgmodule-2.0 -lxml2 -lgthread-2.0 -lrt -lglib-2.0

最初の3つのオブジェクトを追加することで、「_startが見つかりません」というメッセージは表示されません。しかし、その後、私は上記2件の苦情を取得:

/usr/lib/crt1.o: (の.text + 0x12を):機能_start__libc_csu_fini /usr/lib/crt1.oに未定義の参照: (の.text + 0x19):関数_startに未定義参照

__libc_csu_initに私は無駄にもcrt1.o初前に、リストにcrtbegin.oとcrtend.oを追加しようとしました。リンカの正しい呼び出しは何ですか?

(ポスト編集):他に何も機能しない場合は、正確なGCCをリンクに使用されている場合GCCはLDに渡しているパラメータものをキャッチする方法はありますか?

+0

あなたはclangとリンクしてみましたか? –

+0

はい、私はclangで試しました - もっと明白にするために書き直します –

答えて

1

-Wl,-export-dynamicを使用すると、-export-dynamicを知りません。

2

gccは、言語サポートライブラリとオブジェクトを自動的に提供されたリストにリンクとして追加します。直接ldを呼び出す場合は、自分で追加する必要があります。 man ldから例に取ると、それは-lcを追加

ld -o <output> /lib/crt0.o hello.o -lc 

てみてください可能性があり、あなたが必要とするシンボルは(少なくとも私のシステムで、それはある)それにする必要があります。

+0

ありがとう! "crt * .o"オブジェクトを追加せずにこの "-lc"フラグを追加するだけで、ldはエントリシンボル "_start"が見つからないという不満が残ります。これらのオブジェクトファイルと "-lc"私はそれを実行しようとすると、bashは "-bash:./gnomebaker:No existe el fichero o el directorio"(ファイルやフォルダがスペイン語で存在しない - 申し訳ありませんが、ロケール:P) –

+0

これは 'gnomebaker'ファイルがないことを意味します。 '-o'オプションが間違っていませんか?不審な名前のファイルが他に出現していませんか? – jpalecek

+0

いいえ、オプションは正しく、ファイルは存在しません。ビットを検索した後、ここで問題が見つかりました:http://stackoverflow.com/questions/2716702/no-such-file-or-directory-error-when-executing-a-binary私も実行できませんファイルとlddも失敗します。 "gnomebaker"バイナリが私のシステムに存在しない/lib/ld64.so.1を探していることがわかります。これを理解して修正する必要があります。 –

関連する問題