7

新しいubuntu 12.10サーバーでchironfsをコンパイルしたところ、次のエラーが発生しました。

gcc  -Wall -W -Wmissing-prototypes -g -O2 -DFUSE_USE_VERSION=25 -D_FILE_OFFSET_BITS=64 -I/usr/local/include -g -O2 -lm -lfuse  -o chironfs chironfs.o chiron-conf.o chirondbg.o chironfn.o  
chironfs.o: In function `chiron_init':
/root/chironfs-1.1.1/src/chironfs.c:2000: undefined reference to `pthread_create'
chironfs.o: In function `get_rights_by_name':
/root/chironfs-1.1.1/src/chironfs.c:452: undefined reference to `fuse_get_context'

pthread エラーは、-lpthread が欠落していることを示していますが、ヒューズ エラーはちょっと奇妙な原因です -lfuse が使用されています

ここで、オブジェクト ファイルの後にライブラリを配置することを提案するソリューションを見つけました

だから私は -lfuse を削除し、行の最後に -lfuse -lpthread を追加しました

今ではエラーなしでコンパイルされ、これが本来あるべき方法のようです: オブジェクトファイルの後のライブラリ

私の質問は: パラメータの順序が gcc/ld に関連するのはなぜですか? gcc は他のすべてのアプリケーションと同じようにパラメーターを解析するだけで、必要なパラメーターを ld などに転送できると思いました

一般的に: gcc パラメーターの順序付けに関する事実やヒント、およびこの方法が必要な理由についての背景情報を知っている人はいますか?

ありがとう

4

2 に答える 2

9

オブジェクトとライブラリの順序は、リンカーに関連しています (実行可能ファイルの作成時にコンパイラによって暗黙的に呼び出されます)。リンカーが左から右へのスキャンで、知らない名前の使用を見つけると、その時点から定義を探し始めます。定義が通過した場合、後で使用するためにそれを記憶しません。

于 2013-01-31T12:07:57.707 に答える
2

GCC 自体は比較的透過的な方法でパラメーターを ld に渡します。

あなたの質問は、 ld リンカーがどのように機能するかについてです。簡単にするため、および無限ループなしで循環参照を処理するために、ライブラリのリストを 1 回だけ通過して参照を解決します。したがって、参照がどこかで発生し、それを含むライブラリがまだ表示されていない場合、それは単なるエラーです。

また、この質問について詳しく説明されているこのディスカッションをお読みください。

于 2013-01-31T12:07:32.023 に答える