【问题标题】:yum : using boost 1.69 instead of default (1.53) version on centosyum : 在 centos 上使用 boost 1.69 而不是默认 (1.53) 版本
【发布时间】:2020-09-28 11:52:38
【问题描述】:

我想使用 boost 1.69 编译 (c++/cmake) 代码。我在 centos 7 上。

之后:

sudo yum install boost-devel.x86.64

代码编译良好,但使用默认版本 1.53。

如果我查看 /lib64 中安装的库,我会看到例如:

>> ls -al  /lib64/ | grep boost_timer
lrwxrwxrwx.   1 root root          27 Jun  9 11:50 libboost_timer-mt.so -> libboost_timer-mt.so.1.53.0
-rwxr-xr-x.   1 root root       19848 Apr  1 04:26 libboost_timer-mt.so.1.53.0

boost 1.69 的 yum 安装也可用。所以我可以这样做:

sudo yum install boost169-devel.x86_64

例如更新 /lib64/ 的内容

>> ls -al  /lib64/ | grep boost_timer
lrwxrwxrwx.   1 root root          27 Jun  9 11:50 libboost_timer-mt.so -> libboost_timer-mt.so.1.53.0
-rwxr-xr-x.   1 root root       19848 Apr  1 04:26 libboost_timer-mt.so.1.53.0
lrwxrwxrwx.   1 root root          24 Jun  9 11:50 libboost_timer.so -> libboost_timer.so.1.53.0
-rwxr-xr-x.   1 root root       19848 Apr  1 04:26 libboost_timer.so.1.53.0
-rwxr-xr-x.   1 root root       24104 Apr 23  2019 libboost_timer.so.1.69.0

还有:

>> ls /usr/include/ | grep boost
boost
boost169

此时我的工作区仍在编译,但仍在使用 1.53。

我希望我的工作区使用 1.69 进行编译。我可以通过搞砸来实现这一点 FindBoost.cmake 但这感觉不像是干净的事情。

我还尝试(yum)删除了 boost-dev.x86-64,它删除了文件夹 /usr/include/boost 和 /lib64 中的相关 so 文件,例如:

>> ls -al /lib64/ | grep boost_timer
libboost_timer-mt.so.1.53.0
libboost_timer.so.1.53.0
libboost_timer.so.1.69.0

(注意不再有“libboost_timer-mt.so”)

在这一点上,我相信我也可以通过手动创建符号链接 /usr/include/boost 和 /lib64/libboost_*.so 来编译我的工作区,但这也不像是一件干净的事情

(注意:我创建了指向 /usr/include/boost64/boost 的符号链接 /usr/include/boost,并且确实 cmake 停止抱怨 BOOST_INCLUDE_DIR,但是因为我没有为库创建符号链接,所以 cmake仍然抱怨这些)。

是否有更简洁的替代方式来手动创建符号链接?


edit:我确实为编译器抱怨的所有与 boost 相关的库创建了手动符号链接,我可以确认这有效。

【问题讨论】:

  • 你为什么不直接从 boost.org 获取安装 1.73?
  • @user14717 因为使用系统提供的库是在 CentOS 的企业操作系统上运行的方式。使用源安装的库进行编译不是安全的事情,即使它是较新的。系统提供的库将通过包更新进行安全反向移植,源安装则不会。

标签: c++ boost cmake centos yum


【解决方案1】:

所以显然有 BOOST_INCLUDE_DIR 可以用来控制提升标头的位置,所以为什么不直接

cmake -DBOOST_INCLUDEDIR=/usr/include/boost169 \
  -DBOOST_LIBRARYDIR=/usr/lib64/boost169 \
  ...

【讨论】:

  • yop,这有助于包含。联动怎么样?
  • @Vince 我相信你在关注-DBOOST_LIBRARYDIR=/usr/lib64/boost169
  • 我更希望有一种设置 boost 1.69 的方法具有“默认”boost,即无需设置编译选项。这可能不可行,在这种情况下,我会将您的答案设置为有效的。
  • 我同意这是不可行的。但是设置特定于操作系统的编译选项并不是一个大问题:如果您要为应用程序构建一个 RPM,那将只是 .spec 文件中带有条件的几行代码。生成的 RPM 文件将取决于,例如libboost_timer.so.1.69.0(由rpmbuild自动添加)。有了这个依赖,当用户yum install RPM 时,它会解析到正确的包boost169-timer(来自EPEL)。
【解决方案2】:

设置 CMake 的默认值最接近的方法是将 BOOST_INCLUDEDIRBOOST_LIBRARYDIR 设置为环境变量。 FindBoost.cmake 在环境中显式查找这些变量(默认情况下 CMake 不执行此操作)。所以你可以在某个地方全局使用export BOOST_INCLUDEDIR=/usr/include/boost169export BOOST_LIBRARYDIR=/usr/lib64/boost169,或者你也可以使用BOOST_INCLUDEDIR=/usr/include/boost169 BOOST_LIBRARYDIR=/usr/lib64/boost169 ./mybuild.sh 来包装命令调用(当然,假设mybuild.sh 最终会调用CMake 或自己处理这些环境变量)。

【讨论】:

    猜你喜欢
    • 2020-12-20
    • 2011-05-14
    • 2021-09-21
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    • 2020-12-30
    • 2016-03-09
    相关资源
    最近更新 更多