Ubuntu 16.04を実行しています。second.cpp
次のC ++ソースファイルがあります。
#include <iostream>
#include <boost/filesystem/operations.hpp>
namespace bfs = boost::filesystem;
int main(){
bfs::path p("second.cpp");
if (bfs::exists(p))
std::cout << p.leaf() << std::endl;
}
私が実行すると、$ g++ -o second second.cpp
次のようになります。
/tmp/ccyWlRx6.o: 関数
boost::filesystem::path::leaf() const': second.cpp:(.text._ZNK5boost10filesystem4path4leafEv[_ZNK5boost10filesystem4path4leafEv]+0x2e): undefined reference to
Boost::filesystem::path::filename() const' /tmp/ccyWlRx6.o: 関数 Boostboost::filesystem::exists(boost::filesystem::path const&)': second.cpp:(.text._ZN5boost10filesystem6existsERKNS0_4pathE[_ZN5boost10filesystem6existsERKNS0_4pathE]+0x2f): undefined reference to
::filesystem::detail::status(boost::filesystem::path const&, Boost::system::error_code*)' Collect2: エラー: ld が 1 つの終了状態を返します。
ただし、実行すると、g++ -o second second.cpp -lboost_filesystem
コードはエラーなしでコンパイルされます。libboost_filesystem.a
、libboost_filesystem.so
とlibboost_filesystem.so.1.67.0
は両方にあります/usr/local/lib
。
/etc/ld.so.conf
次のようになります。
include /etc/ld.so.conf.d/*.conf
/usr/local/lib
私は逃げたsudo ldconfig
。
これは正常な行動ですか?私が読んだことによれば、/usr/local/lib
リンカは自動的にファイルを含める必要があるようです。そうでない場合、これを達成する方法はありますか?ご協力ありがとうございます!
答え1
これは正常な行動ですか?
もちろん。ドライバがリンクするライブラリを探していることをコンパイラに知らせない限り、それをやり直さないでください。-l boost_filesystem
ライブラリを使用するプログラムもリンクしません。あなたのコンパイラは魔法ではありません。プログラムがコンパイラがデフォルトで認識するC / C ++ / GCCランタイムライブラリ以外のライブラリと関連付ける必要がある場合は、そのライブラリについてコンパイラに通知する必要があります。
質問のタイトルは嘘です。観察できるように…
実行する
g++ -o second second.cpp -lboost_filesystem
と、コードはエラーなしでコンパイルされます。
... g ++するライブラリの検索/usr/local/lib
:正しく実行した後に、実際に探しているライブラリの名前を知らせます。
-L
また、同じ理由で議論が赤いニシンであることに注意してください。あなたはそれを使用していませんが、-L
g ++がこのライブラリを見つけました。それでも;したがって、ライブラリを含むディレクトリがコンパイラのデフォルトライブラリ検索パスにない場合は、明らかに問題はありません。
あなたは試してさえしませんでした。走るこのプログラムでは、あなたの質問によると、動的ローダーがライブラリを見つけるかどうかはわかりません。しかし、そうかもしれません。
答え2
リンカーが一般的ではない場所でライブラリを検索できるようにするには、オプションを使用してライブラリを含む-L
ディレクトリを指定する必要があります。
ランタイムリンカが実行時に同じライブラリを検索できるようにするには、リンカを使用して-R
バイナリにタグを追加します。RUNPATH
ldconfigは1980年代にこの形式を使用しました。a.out
なぜなら。RUNPATH
ELF
答え3
/etc/ld.so.confにエントリを追加する代わりに、/etc/ld.so.conf.dに設定ファイルを作成する必要があるようです。
/etc/ld.so.confは、ライブラリファイルパスの設定ファイルを含む/etc/ld.so.conf.dディレクトリからすべての設定ファイルを読み込みます。
プロファイル名はシステムで定義されていないため、
必要に応じて名前を付けることができます(例:)locallib.conf
。
だから、こんなこと、
/etc/ld.so.conf.d/locallib.conf
含む
/usr/local/lib
その後、実行した後ldconfig
。
他の方法。
これはシステム全体ではなくローカル環境のみを有効にします。
にライブラリパスエントリを追加します.bashrc
。
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
export LD_LIBRARY_PATH
環境変数を有効にします. ./.bashrc
。
次のコマンドを使用して変数を確認することを忘れないでください。
echo $LD_LIBRARY_PATH