1

gccではなくclangを使用してGTK+プログラムをコンパイルしました。私がldリンクを正しく持つことができないことを除いて、これまでのところ良いです。

次のように、リンクを行うためのgccという元のmakefile:

gcc -g -O2 -export-dynamic -o my_application somefile.o another.o -pthread -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 -pthread -lgstreamer-0.10 -lgobject-2.0 -lgmodule-2.0 -lxml2 -lgthread-2.0 -lrt -lglib-2.0

上記のコマンドで単にgccclangに置き換えると、後者から次の警告が表示されます。

clang:警告:コンパイル中に引数が使用されていません:'-e xport-dynamic'

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

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

だから私はこれを試しました:

ld /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o -g -O2 -export-dynamic 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:関数内_start:(。text + 0x12): /usr/lib/crt1.oへの未定義の参照:__libc_csu_fini 関数_start内:(。text + 0x19):への未定義の参照__libc_csu_init

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

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

4

2 に答える 2

2

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

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

追加-lcしてみてください。必要な記号が含まれている必要があります(少なくとも私のシステムではそうです)。

于 2012-04-23T12:38:50.173 に答える
1

あなたはそれについて知らなくてもld-Wl,-export-dynamicに渡すために使うことができます。-export-dynamic

于 2012-04-24T13:11:19.423 に答える