私はlibrtを使用する小さなCプログラムを書いています。GCCを使用してライブラリリンカーフラグが最後に移動する必要があるのはなぜですか?
gcc -o prog prog.c -lrt -std=gnu99
:私は開始時に代わりの最後にリンクフラグを配置すると、プログラムがコンパイルされませんことを、非常に驚いています私は以下を実行した場合
、それはlibrt内の関数を見つけるために失敗します。
gcc -std=gnu99 -lrt -o prog prog.c
しかし、これは他のライブラリで動作します。シンプルなMakefileを使用しようとしたときに問題が見つかりました。最初に好きなように実際にコンパイルしたprog.cを作成し(-cフラグを使用して)、リンクを行いました。
これはMakefileのです:入力を行うとき、私はなるだろう
CC = gcc
CFLAGS = -std=gnu99
LIBS= -lrt
LDFLAGS := -lrt
prog: prog.o
$(CC) -o prog prog.c -lrt -std=gnu99
出力は次のようになります。
gcc -std=gnu99 -c -o prog.o prog.c
gcc -lrt prog.o -o prog
prog.o: In function `main':
prog.c:(.text+0xe6): undefined reference to `clock_gettime'
prog.c:(.text+0x2fc): undefined reference to `clock_gettime'
collect2: ld returned 1 exit status
make: *** [buff] Error 1
私は今、GCCの末尾にリンクを置くMakefileを作り上げてきましたしかし、リンクフラグが最初にあれば、なぜ動作しないのか困惑しています。
誰かが私にこのことを説明できるかどうかは分かります。ありがとう。
これは100%ではありませんが、リンカーがlibrtを見ていて、それに何も必要ないと判断するかもしれないと思います。 librtは静的ライブラリですか? – spencercw
静的リンクが順序依存である理由の説明については、この質問への回答を参照してください。http://stackoverflow.com/questions/45135/linker-order-gcc –
リンカーの* as-needed *オプションが使用されている可能性がありますデフォルトでは'gcc -std = gnu99 -Wl、-no-as-needed -lrt -o prog prog.c'を試すことができます。 –