我得到了新安装的Ubuntu11.10和内核版本3.0.0-23-通用和+/-默认情况下,我得到了以下1.46.1版本的Boost,它安装在/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,并拉出许多副作用,这将使我的系统不稳定,我不想这样。所以我从源代码安装了Boost1.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++/gcc Boost版本,如下所示:
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/lib 1.50安装吗?这样做会导致我的系统崩溃吗?我不想再冒重新安装的风险。
发布于 2012-08-26 21:59:58
我可以尝试通过标准的Ubuntu方式更新它,但这很可能意味着我需要获得一些第三方ppa,并拉出许多副作用,这将使我的系统不稳定
您可以添加一个PPA,只安装所需的包,然后(如果PPA包含的不仅仅是Boost库)删除它,这样其他包都不会自动更新。我认为这是最简单的方法。
然而,我正在使用的一个使用“默认”系统设置进行编译和链接的工具最终选择了1.46.1
它是什么类型的工具?也许你可以将其配置为从自定义位置使用Boost?如果它是基于gcc的,让它将-I和-L标志传递给编译器和链接器可能会有所帮助。
我能不能简单地清除所有那些旧的Boost 1.46安装并转移到默认的/usr/include和/usr/lib 1.50安装?这样做会导致我的系统崩溃吗?
在大多数GNU/Linux发行版(其中包括Ubuntu )中,/usr前缀是为使用发行版的包管理器管理的软件保留的。在那里安装一个非打包的软件一开始是可行的,但是当一些包实际上包含相同的文件时,你可能会遇到一些麻烦(例如包管理器的抱怨)。这就是为什么对于手动编译的非打包软件,通常会使用其他前缀,如/usr/local或/opt/something。
大多数共享库都是版本化的,因此在同一系统上同时安装它们的多个版本是安全的。特别是,在Ubuntu中可以有多个版本的Boost运行时包。如果您仍然希望手动将Boost安装到/usr,则不必删除旧的Boost运行时版本,如果您发现一些重要的软件包依赖于它们,这是很好的。
但是,在将新编译的Boost安装到/usr之前,请首先从系统中删除所有* Boost *开发包(以及依赖于它们的所有其他*开发包),因为它们包含头文件(许多Boost组件仅包含头文件)、静态库和指向特定运行时库版本的符号链接。
为了确认它可以工作,我使用这种方法在我的Ubuntu11.04上编译并安装了Boost1.51到/usr,没有任何损坏。智能仍然使用Boost 1.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-26 22:05:04
你的问题是
我的问题是,我是否可以简单地清除所有那些旧的Boost 1.46安装,并转移到默认的/usr/include和/usr/lib 1.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.40和1.46,尽管我的开发版本现在是1.48。
所以你最好的办法就是...从PPA获取1.50甚至1.51 (如果存在这样的版本),或者安装到/usr/local中并调整您的makefile / configure / cmake / ...相应的设置。
https://stackoverflow.com/questions/12129478
复制相似问题