g++は/etc/ld.so.confに追加し、ldconfigを実行した後も/usr/local/lib/に.soファイルが見つかりません。

g++は/etc/ld.so.confに追加し、ldconfigを実行した後も/usr/local/lib/に.soファイルが見つかりません。

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 toBoost::filesystem::path::filename() const' /tmp/ccyWlRx6.o: 関数 Boost boost::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.alibboost_filesystem.solibboost_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また、同じ理由で議論が赤いニシンであることに注意してください。あなたはそれを使用していませんが、-Lg ++がこのライブラリを見つけました。それでも;したがって、ライブラリを含むディレクトリがコンパイラのデフォルトライブラリ検索パスにない場合は、明らかに問題はありません。

あなたは試してさえしませんでした。走るこのプログラムでは、あなたの質問によると、動的ローダーがライブラリを見つけるかどうかはわかりません。しかし、そうかもしれません。

答え2

リンカーが一般的ではない場所でライブラリを検索できるようにするには、オプションを使用してライブラリを含む-Lディレクトリを指定する必要があります。

ランタイムリンカが​​実行時に同じライブラリを検索できるようにするには、リンカを使用して-Rバイナリにタグを追加します。RUNPATH

ldconfigは1980年代にこの形式を使用しました。a.outなぜなら。RUNPATHELF

答え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

関連情報