1

コードをコンパイルしましたが、失敗しました。

# g++ -g test.cpp -o test -lboost_filesystem                                  
/tmp/cc5yybJZ.o(.text+0xb0): In function `__static_initialization_and_destruction_0':
/usr/local/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()'
/tmp/cc5yybJZ.o(.text+0xbc):/usr/local/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::generic_category()'
/tmp/cc5yybJZ.o(.text+0xc8):/usr/local/include/boost/system/error_code.hpp:216: undefined reference to `boost::system::system_category()'
/tmp/cc5yybJZ.o(.gnu.linkonce.t._ZN5boost10filesystem9file_sizeERKNS0_4pathE+0x19): In function `boost::filesystem::file_size(boost::filesystem::path const&)':
/usr/local/include/boost/filesystem/operations.hpp:447: undefined reference to `boost::filesystem::detail::file_size(boost::filesystem::path const&, boost::system::error_code*)'
collect2: error: ld returned 1 exit status

しかし、-L / usr / local/libでコンパイルすると成功しました

g++ -g test.cpp -o test -lboost_filesystem -L/usr/local/lib

/usr/local/libすでに構成されています/etc/ld.so.conf

# cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
/usr/lib64
/usr/local/lib
/usr/local/mpc/lib
/usr/local/mpfc/lib

どういう理由ですか?
-L /libpathと/etc/ld.so.confの違いは何ですか?libpathを設定しますか?

4

2 に答える 2

4

/etc/ld.so.confダイナミックリンカ(マンページを参照ld.so(8))がライブラリファイルを検索するパスを特定するために使用します。これは実行時に発生します。

に渡す必要があります。に渡す-L/usr/local/libgcc、に渡されldます(マンページを参照ld(1))。これはコンパイル時に発生します。

パスを自動的に検索しないgcc、または検索しないのはなぜですか?考えられる理由はいくつかあると思います。(1)このような自動動作が増えると、システムがより複雑になり、理解しにくくなります。(2)異なるダイナミックリンカーを備えたシステムで実行されます(またはまったく実行されません)。(3)おそらく、その動作はあなたが望んでいたものではなく、それをオフにするための追加の方法が必要になるでしょう。ld/etc/ld.so.confgcc

いずれにせよ、ほとんどのLinuxシステムでは、ライブラリを適切な場所(通常/usr/lib)に配置するパッケージマネージャーがあるだけなので、これは通常問題にはなりません。それ以外の場合は、必要なディレクティブCFLAGSを含めるために独自の変数を定義するのが通例です。-L...

スペックファイルを変更することで、(とりわけ)gccさまざまなディレクティブを自動的に渡すように構成することもできます。-L...

于 2013-01-06T07:14:15.940 に答える
2

/etc/ld.so.confはランタイムのものであり、Linuxが実行可能ファイルの実行に必要な共有ライブラリを見つけることができます。

環境で$LD_LIBRARY_PATHを定義することにより、/ etc/ld.so.confを拡張できます。

一方、「-L」は完全にプログラムをリンクするためのものです。それは「古い」ものです。g ++コマンドで「-L」を指定すると、リンクエラーが修正されます。

「ldd」コマンドを使用して、バイナリに必要な共有ライブラリと、それらが見つかると予想される環境内の場所を確認できます。

于 2013-01-06T07:17:10.877 に答える