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
上記のコマンドで単にgccをclangに置き換えると、後者から次の警告が表示されます。
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に渡している正確なパラメーターをキャッチする方法はありますか?