2011-12-23 16 views
3

gccを使用する場合、-lオプションの配置に問題があります。ここで問題を再現するために、削除されたバージョンがあります。gccの `-l 'オプションの配置

t.c:

#include <pthread.h> 

int main() { 
    pthread_create(0, 0, 0, 0); 
} 

と端末で

$ gcc -lpthread t.c 
/tmp/ccmkwV7B.o: In function `main': 
t.c:(.text+0x29): undefined reference to `pthread_create' 
collect2: ld returned 1 exit status 

$ gcc t.c -lpthread 
$ (compiles ok) 

なぜ私はそれを動作させるために、最後に-lpthreadを入れなければならないのですか?そして、この問題は32bit Linuxでのみ発生するようです。

私の環境情報は以下に添付されています:
gcc -lpthread t.cこのマシンでは失敗します。

$ gcc --version 
gcc (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1 

$ uname -rm 
3.0.0-12-generic i686 

gcc -lpthread t.cがこのマシンで動作します。


$ uname -rm 
2.6.18-274.3.1.el5 x86_64 

$ gcc --version 
gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-51) 

私はgccのマニュアルを見上げ、それが "-lの位置は重要である" と述べています。それはどういう意味ですか? manualから

+0

これはリンカのほとんどに依存します。両方のシステムで 'ld --version'を実行できれば、もっと啓発されるかもしれません。 –

答えて

5

それはコマンドでこのオプションを書き違いが。リンカーは指定された順序でライブラリとオブジェクトファイルを検索して処理します。したがって、ファイルfoo.oの後、bar.oの前にfoo.o -lz bar.oがライブラリzを検索します。 bar.ozの関数を参照する場合、それらの関数はロードされない可能性があります。

これは、ライブラリをリンクすることがgcc 4.1.2で最初に機能することは非常に興味深いことを意味します。これは、コンパイラによってリンクされているデフォルトのライブラリと関係があります。いくつかのインストールでは、pthreadに明示的にリンクする必要はありません。

これ以上の反省の上で、問題はフラグ--as-neededであり、gcc 4.6システムではデフォルトでオンになっている可能性があります。詳細は、linkを参照してください。

関連する問題