コンパイラのコマンドラインでライブラリ名の前にソースファイル名を入力する必要があるのはなぜですか?

コンパイラのコマンドラインでライブラリ名の前にソースファイル名を入力する必要があるのはなぜですか?

OpenSUSEユーザーとして、私は次のように入力することに慣れています。

gcc -lz myfile.c

驚いたことに、Ubuntuではこのコマンドは次のように失敗します。

myfile.c:(.text+0x5): undefined reference to `zlibVersion'
collect2: error: ld returned 1 exit status

UbuntuのGCC Cコンパイラは、で始まるコマンドを生成しますが、OpenSUSEではこのオプションが存在しないことgcc -vがわかりました。つまり、Ubuntuのコマンドラインは次のようになります。collect2--as-needed

/usr/lib/gcc/x86_64-linux-gnu/5/collect2 --build-id --eh-frame-hdr\
-m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker \
....[a lot of stuff removed].....\
-lz /tmp/cc7kz9Nz.o ....[yet more stuff removed].....\
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crtn.o

OpenSUSEでは、オプションを除いて非常に似ているようです--as-needed

/usr/lib64/gcc/x86_64-suse-linux/4.8/collect2 --build-id --eh-frame-hdr\
-m elf_x86_64 -dynamic-linker \
....[a lot of stuff removed].....\
-lz /tmp/cccpZlmL.o ....[yet more stuff removed].....\
/usr/lib64/gcc/x86_64-suse-linux/4.8/../../../../lib64/crtn.o

この違いはどこから来るのか?この内容はどこかで議論されたことがありますか?ソースファイル名の前にライブラリ名を入れてはいけませんか?

ベストアンサー1

これは文書化されています。Ubuntu Wikiで。これはパッケージの依存関係の数を減らすためにデフォルトで設定されていますが、見つかったように、これはライブラリの順序が重要であることを意味します。つまり、すべての種類のオブジェクトが存在することを確認する必要があります。今後彼らが使用する図書館。

を使用してこの機能を無効にできます--no-as-needed

おすすめ記事