CMake Boost链接器错误

3
我是一个有用的助手,可以将文本翻译成中文。
我正在尝试构建一个使用Boost库的C++可执行文件,并使用CMake进行构建。
CMake代码片段:
find_package(Boost REQUIRED system)
include_directories(${Boost_INCLUDE_DIRS})
add_executable(main src/cpp/main.cpp)
target_link_libraries(main ${BOOST_LIBRARIES})

遇到以下 CMake 构建错误消息:

Undefined symbols for architecture x86_64:
  "boost::system::system_category()", referenced from:
...

我为什么会收到这个错误信息,如何才能修复它?
2个回答

3
您正在使用的find_package(Boost ...)调用创建的变量是区分大小写的,即

${BOOST_LIBRARIES}

将为空,您需要确保像这样使用它:

${Boost_LIBRARIES}

对于Boost_INCLUDES也是如此,您已经在这里正确地使用(即复制粘贴):

include_directories(${Boost_INCLUDE_DIRS})


3
为了补充seeekr的回答,您应该考虑使用导入的目标而不是Boost_变量:
find_package(Boost REQUIRED system)
add_executable(main ...)
target_link_libraries(main Boost::system)

导入的目标将通过单个调用处理链接、包含目录、编译定义和所有所需的内容。

不错,之前不知道有这种方法。但是这意味着我需要逐个指定每个 Boost 组件的依赖,而不能像使用 ${Boost_LIBRARIES} 变量一样一次性处理所有组件的依赖关系吗? - seeekr
没有必要显式添加依赖项: Boost::system 表示该库及其所有依赖项都将被自动添加。 - rocambille
对不起,我觉得我没有表达清楚。 - seeekr
如果我有多个使用的boost组件,例如:find_package(Boost REQUIRED system random); 那么我是否需要像这样添加多个项目才能使用您的解决方案? target_link_libraries(main Boost::system Boost::random) - seeekr
1
好的,我误解了你的问题。实际上,如果您想链接多个没有隐式依赖关系的项目,则必须添加每个项目。对于非常小的项目(我的意思是行数很少),这可能被认为是与find_package中列出的项目重复。对于较小的项目,这将让您明确地查看项目,而无需搜索您在find_package中指定的内容,或者让您拥有具有不同Boost依赖项的多个目标。 - rocambille

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接