3

Ubuntu 11.10とカーネルバージョン3.0.0-23-genericおよび+/-の新規インストールを取得しました。デフォルトでは、Boostの次のバージョン1.46.1を取得します。これは、およびの下にインストールされ/usr/include/boostます/usr/lib

bravegag@Zeus:~/code/roofline/tool$ dpkg --get-selections | grep boost
libboost-date-time1.46.1        install
libboost-dev                    install
libboost-iostreams1.46.1        install
libboost-program-options1.46.1  install
libboost-serialization1.46.1    install
libboost-thread1.46.1           install
libboost1.46-dev                install

標準のUbuntuの手段で更新してみることができますが、これはおそらく、サードパーティのppaを入手し、副作用としてシステムを不安定にする多くのがらくたを取得する必要があることを意味します。そこで、ソースからBoost 1.50をインストールし、との下にインストールしまし/usr/local/include/boost/usr/local/lib

私が持っているCMakeプロジェクトは1.50バージョンを問題なくピックアップしています。ただし、「デフォルト」のシステム設定を使用してコンパイルおよびリンクするツールは、1.46.1バージョンを選択することになり、エラーメッセージが表示src/utils.h:17:25: error: ‘boost::BOOST_FOREACH’ has not been declaredされるため、明らかに1.50バージョンを選択していません。

デフォルトのg++/gccBoostバージョンを次のように上書きしてみました。

export CPLUS_INCLUDE_PATH=/usr/local/include/boost/:$CPLUS_INCLUDE_PATH   
export LIBRARY_PATH=/usr/local/lib/:$LIBRARY_PATH

しかし、これでもうまくいきません...私の質問は、古いBoost 1.46のインストールをすべて一掃して、デフォルトのインストール/usr/include/usr/lib1.50のインストールに移行することはできないのでしょうか。これを行うと、システムが壊れますか?私は別の再インストールの危険を冒したくありません。

4

2 に答える 2

4

標準のUbuntuの手段で更新してみることができますが、これはおそらく、サードパーティのppaを入手し、副作用としてシステムを不安定にする多くのがらくたを引っ張る必要があることを意味します

PPAを追加し、必要なパッケージのみをインストールし、(PPAにBoostライブラリ以外のものが含まれている場合は)それを削除して、他のパッケージが自動更新されないようにすることができます。それが一番簡単な方法だと思います。

ただし、「デフォルト」のシステム設定を使用してコンパイルおよびリンクするツールを使用すると、1.46.1が選択されることになります。

どんな道具ですか?たぶん、カスタムの場所からBoostを使用するように構成できますか?gccベースの場合は、コンパイラとリンカに-Iフラグと-Lフラグを渡すようにすることが役立つ場合があります。

これらの古いBoost1.46インストールをすべて一掃して、デフォルトの/ usr/includeおよび/usr/ lib 1.50インストールに移動することはできませんか?これを行うと、システムが壊れますか?

ほとんどのGNU/Linuxディストリビューション(Ubuntuを含む)では、/usrプレフィックスはディストリビューションのパッケージマネージャーで管理されるソフトウェア用に予約されています。パッケージ化されていないソフトウェアをそこにインストールすることは最初は機能しますが、一部のパッケージに実際に同じファイルが含まれる場合、問題が発生する可能性があります(パッケージマネージャーの苦情など)。そのため、手動でコンパイルされたパッケージ化されていないソフトウェアの場合、/usr/localまたはなどの他のプレフィックスを使用するのが一般的/opt/somethingです。

ほとんどの共有ライブラリはバージョン管理されているため、同じシステムに同時に複数のバージョンをインストールしても安全です。特に、UbuntuにはBoostランタイムパッケージの複数のバージョンを含めることができます。それでもBoostを手動でインストールしたい場合は/usr、古いBoostランタイムバージョンを削除する必要はありません。これは、いくつかの重要なソフトウェアパッケージがBoostに依存していることがわかった場合に便利です。

ただし、新しくコンパイルしたBoostをにインストールする前に/usr、まずシステムからすべての* boost * devパッケージ(およびそれらに依存する他のすべての* devパッケージ)を削除します。これらにはヘッダーファイルが含まれているためです(多くのBoostコンポーネントはヘッダーのみです)。静的ライブラリと特定のランタイムライブラリバージョンへのシンボリックリンク。

それが機能することを確認するために、/usrこの方法を使用してBoost1.51をコンパイルしてUbuntu11.04にインストールしましたが、何も壊れませんでした。Aptitudeは引き続きBoost1.42を使用します。

$ ldd /usr/bin/aptitude | grep boost
libboost_iostreams.so.1.42.0 => /usr/lib/libboost_iostreams.so.1.42.0 (0x00007f536ee77000)

そして、新しくコンパイルされたプログラムは新しいバージョンを使用します:

$ g++ my-boost-test.c -lboost_thread -o my-boost-test
$ ldd my-boost-test | grep boost
libboost_thread.so.1.51.0 => /usr/lib/libboost_thread.so.1.51.0 (0x00007f543d1df000)
libboost_chrono.so.1.51.0 => /usr/lib/libboost_chrono.so.1.51.0 (0x00007f543c49e000)
libboost_system.so.1.51.0 => /usr/lib/libboost_system.so.1.51.0 (0x00007f543c29a000)
于 2012-08-26T13:59:57.933 に答える
2

あなたの質問

私の質問は、これらの古いBoost 1.46インストールをすべて一掃して、デフォルトの/ usr/includeおよび/usr/lib1.50インストールに移行することはできないのでしょうか。これを行うと、システムが壊れますか?私は別の再インストールの危険を冒したくありません。

パッケージ間には多くの逆依存関係があり、したがって特定のバージョンへの依存関係があるため、そうなる可能性があります。たとえば、私のUbuntuシステム(数回アップグレードされた)

edd@max:~$ dpkg -l | grep libboost-date-time | cut -c-72
ii  libboost-date-time-dev                        1.48.0.2              
rc  libboost-date-time1.38.0                      1.38.0-6ubuntu6       
ii  libboost-date-time1.40.0                      1.40.0-6ubuntu1       
rc  libboost-date-time1.42.0                      1.42.0-4ubuntu2       
ii  libboost-date-time1.46-dev                    1.46.1-7ubuntu3       
ii  libboost-date-time1.46.1                      1.46.1-7ubuntu3       
edd@max:~$ 

1.38と1.42が完全に置き換えられたことがわかりますが、開発バージョンが1.48になっているにもかかわらず、1.40と1.46に依存する他のパッケージがまだあります。

したがって、最善の方法は...そのようなバージョンが存在する場合はPPAから1.50または1.51を取得するか、それに/usr/local応じてmakefile / configure / cmake/...設定にインストールして調整することです。

于 2012-08-26T14:05:04.320 に答える