0

ブースト インストールが必要であると明示的に主張する Linux ツールをインストールしようとしています (http://www.statmt.org/moses/?n=Development.GetStarted)。

boost1.42 のソースコード (/usr/local/boost1.42 に配置) をダウンロードしてコンパイルしました。コンパイルプロセスでは多くのエラーと警告が生成されますが (これは正常ですか? boost の公式 Web サイトでは、IO エラー以外のエラーは発生しないはずです)、最終的に /usr に /stage/lib と /boost を取得しました。 /local/boost1.42 ディレクトリ。これで、次のような例を実行できます。

 #include <boost/regex.hpp>
#include <iostream>
#include <string>

int main()
{
    std::string line;
    boost::regex pat( "^Subject: (Re: |Aw: )*(.*)" );

    while (std::cin)
    {
        std::getline(std::cin, line);
        boost::smatch matches;
        if (boost::regex_match(line, matches, pat))
            std::cout << matches[2] << std::endl;
    }
}

 $ c++ -I /usr/local/boost_1_42_0 example.cpp -o example -L~/usr/local/boost_1_42_0/stage/lib/ -lboost_regex

これは実際に実行可能ファイル「例」を出力し、コンパイルの警告はなく、正しい動作をします。しかし、そのリンケージの詳細を表示したい場合:

$ldd -v example

結果は非常に紛らわしいです:

    linux-vdso.so.1 =>  (0x00007fffb4b9c000)
    libboost_regex.so.1.42.0 => not found
    libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x0000003f79600000)
    libm.so.6 => /lib64/libm.so.6 (0x0000003f72e00000)
    libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x0000003f78e00000)
    libc.so.6 => /lib64/libc.so.6 (0x0000003f72200000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003f72a00000)
    /lib64/ld-linux-x86-64.so.2 (0x0000003f71e00000)

    Version information:
    ./example:
            libgcc_s.so.1 (GCC_3.0) => /lib64/libgcc_s.so.1
            libpthread.so.0 (GLIBC_2.2.5) => /lib64/libpthread.so.0
            libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
            libstdc++.so.6 (CXXABI_1.3) => /usr/lib64/libstdc++.so.6
            libstdc++.so.6 (GLIBCXX_3.4) => /usr/lib64/libstdc++.so.6
    /usr/lib64/libstdc++.so.6:
            libm.so.6 (GLIBC_2.2.5) => /lib64/libm.so.6
            ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
            libgcc_s.so.1 (GCC_4.2.0) => /lib64/libgcc_s.so.1
            libgcc_s.so.1 (GCC_3.3) => /lib64/libgcc_s.so.1
            libgcc_s.so.1 (GCC_3.0) => /lib64/libgcc_s.so.1
            libc.so.6 (GLIBC_2.4) => /lib64/libc.so.6
            libc.so.6 (GLIBC_2.3) => /lib64/libc.so.6
            libc.so.6 (GLIBC_2.3.2) => /lib64/libc.so.6
            libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
    /lib64/libm.so.6:
            libc.so.6 (GLIBC_PRIVATE) => /lib64/libc.so.6
            libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
    /lib64/libgcc_s.so.1:
            libc.so.6 (GLIBC_2.4) => /lib64/libc.so.6
            libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
    /lib64/libc.so.6:
            ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2
            ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
    /lib64/libpthread.so.0:
            ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
            ld-linux-x86-64.so.2 (GLIBC_2.2.5) => /lib64/ld-linux-x86-64.so.2
            ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2
            libc.so.6 (GLIBC_2.3.2) => /lib64/libc.so.6
            libc.so.6 (GLIBC_PRIVATE) => /lib64/libc.so.6
            libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6

リンカが /usr/local/boost1.42/stage/lib/libboost_regex.a で libboost_regex.a を見つけられなかったようです (ldd ログを参照してください: libboost_regex.so.1.42.0 => 見つかりません)。

では、実際にロードしたいライブラリはどれでしょうか? 「not found」が正しい実行可能ファイルを生成することが判明したのはなぜですか?

また、ブーストが正常にインストールされていることを確認したい場合は、/usr/local/boost1.42 と /usr/local/boost1.42/stage/lib をどこかにエクスポートして、他のプログラムがその場所を認識できるようにする必要がありますか? ?

ありがとう!ホンビン

4

2 に答える 2

3

boost を非標準の場所 (ld.so.conf で指定されていない場所) にインストールして使用するには、次のようにします。

  1. --prefixおよび--libdirオプションを使用してブーストを構成します。

    $ ./bootstrap.sh --prefix=${PREFIX} --libdir=${PREFIX}/lib64
    
  2. ブースト設定 rpath を と同じ値にビルドしてインストールします--libdir。たとえば、次のようにします${PREFIX}/lib64

    $ ./b2 -d+2 --layout=system variant=release link=shared threading=multi runtime-link=shared linkflags="-Wl,-rpath,${PREFIX}/lib64"
    
    $ sudo ./b2 -d+2 --layout=system variant=release link=shared threading=multi runtime-link=shared linkflags="-Wl,-rpath,${PREFIX}/lib64" install
    
  3. ブースト インクルード ディレクトリを指定してアプリケーションをコンパイルします。

    $ g++ -c -I${PREFIX}/include ...
    
  4. ブースト ライブラリの場所を指定してアプリケーションをリンクします。また、rpath をバイナリに埋め込むことで、アプリケーションは、いじる必要なくブースト ライブラリを見つけることができますLD_LIBRARY_PATH

    $ g++ -L${PREFIX}/lib64 -Wl,-rpath,${PREFIX}/lib64 ...
    

上記で PREFIX を設定してインストール場所を増やしexport PREFIX=/usr/local/my_boostます。

于 2012-05-14T10:30:37.813 に答える
0

はい、動的リンカーに共有オブジェクト (.soファイルではなく.aファイル) が配置されている場所を伝える必要があります。

これはLD_LIBRARY_PATH、正しいパスに設定する (およびそれをエクスポートする) か、編集/etc/ld.so.conf(またはディストリビューションによっては他の設定ファイル) によって行うことができます。

(別のオプションはrpath、実行可能ファイルをリンクするときにオプションを使用することですが、環境設定は開発に対してより柔軟です。)

于 2012-05-14T05:07:30.853 に答える