c++ - Boost_NO_SYSTEM_PATHS 无法识别
问题描述
我无法让 CMake (3.16.4) 和 boost 像他们应该的那样一起工作。
我的系统安装了 boost (v1.72),我编译了另一个版本,如下所示:
wget https://dl.bintray.com/boostorg/release/1.71.0/source/boost_1_71_0.tar.gz
tar -xf boost_1_71_0.tar.gz
cd boost_1_71_0 && ./bootstrap.sh && ./b2 --prefix=../external/boost_1_71_0 --with-timer install
我有一个使用升压计时器的简单测试程序:
#include <iostream>
int main()
{
boost::timer::auto_cpu_timer t;
std::cout << "Hello Timer" << std::endl;
return 0;
}
这就是 CMakeLists.txt:
cmake_minimum_required(VERSION 3.16.4)
Project(CmakeBoostText)
set(Boost_DEBUG 1)
set(Boost_NO_SYSTEM_PATHS ON)
set(BOOST_ROOT ../external/boost_1_71_0)
find_package(Boost 1.71 REQUIRED COMPONENTS timer)
add_executable(main main.cpp)
target_link_libraries(main Boost::timer)
然后我尝试编译我的测试二进制文件:
rm -rf build/* && cmake -S . -B build && cmake --build build
在输出中,您可以清楚地看到他正在使用 boost 的系统变体:
-- [ /usr/share/cmake-3.16/Modules/FindBoost.cmake:1468 ] Boost_NO_SYSTEM_PATHS = "ON"
-- [ /usr/share/cmake-3.16/Modules/FindBoost.cmake:1537 ] BOOST_ROOT = "../external/boost_1_71_0"
[...]
Found Boost: /usr/lib64/cmake/Boost-1.72.0/BoostConfig.cmake (found suitable version "1.72.0", minimum required is "1.71") found components: timer
使用 ldd 我还可以验证二进制文件是否链接到 boost 的系统库。
这很奇怪。根据 cmake/find_package 中的文档,Boost_NO_SYSTEM_PATHS
应该处理这个问题。
如果我然后将 find_package 更改为包含“EXACT”,它会突然起作用(它会找到并使用正确的版本。但我认为这是一个大黑客。
find_package(Boost 1.71 EXACT REQUIRED COMPONENTS timer)
为什么没有它就不行EXACT
?欢迎澄清。
注意:我不想使用任何涉及include_directories()
. 因此,这些解决方法超出了范围。
解决方案
推荐阅读
- azure - Azure Devops 上的 Azure 虚拟机规模集 - 无法识别预定义变量
- android - admob 查看测试广告底部的白色间隙
- java - 安卓工作室:java。如何将数组列表返回到主要活动?
- html - Laravel Cron 工作贷款计算
- google-chrome - 我可以在 Web 浏览器中重定向时保留 cookie
- javascript - HTML 变量不能为空
- apache-spark - 用 pyspark 中其他列上的条件填充 NaN
- textbox - Material-UI 中的 TextBox 无法跨浏览器识别换行 ASCII 代码
- javascript - 如何在 JavaScript 中防止正则表达式中的空格?
- apache-spark - 在 Pyspark 中将日期转换为汇总?