首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将默认的旧boost 1.46替换为1.50

将默认的旧boost 1.46替换为1.50
EN

Stack Overflow用户
提问于 2012-08-26 18:49:39
回答 2查看 6.1K关注 0票数 3

我得到了新安装的Ubuntu11.10和内核版本3.0.0-23-通用和+/-默认情况下,我得到了以下1.46.1版本的Boost,它安装在/usr/include/boost/usr/lib

代码语言:javascript
复制
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版本,如下所示:

代码语言:javascript
复制
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安装吗?这样做会导致我的系统崩溃吗?我不想再冒重新安装的风险。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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:

代码语言:javascript
复制
$ ldd /usr/bin/aptitude | grep boost
libboost_iostreams.so.1.42.0 => /usr/lib/libboost_iostreams.so.1.42.0 (0x00007f536ee77000)

新编译的程序使用新版本:

代码语言:javascript
复制
$ 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)
票数 4
EN

Stack Overflow用户

发布于 2012-08-26 22:05:04

你的问题是

我的问题是,我是否可以简单地清除所有那些旧的Boost 1.46安装,并转移到默认的/usr/include和/usr/lib 1.50安装?这样做会导致我的系统崩溃吗?我不想再冒重新安装的风险。

获取一个清晰的是的,它可以,因为包之间有大量的反向依赖,因此依赖于特定的版本。例如在我的Ubuntu系统上(升级了几次)

代码语言:javascript
复制
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 / ...相应的设置。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12129478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档