Linux下编译Boost时无法正确设置CMakeFiles的Boost包含路径
Boost编译后CMake包含路径缺失/include的解决方案
问题场景
编译Boost后收到提示,包含路径未带/include:
The Boost C++ Libraries were successfully built!
The following directory should be added to compiler include paths:
/<networkpath>/BOOST/boost_1_80_0 ** Note the lack of an /include here!The following directory should be added to linker library paths:
/<networkpath>/BOOST/boost_1_80_0/lib ** Correct
生成的CMake配置文件中,包含路径同样错误:
get_filename_component(_BOOST_INCLUDEDIR "${_BOOST_CMAKEDIR}/../.." ABSOLUTE) ** Again, no /include. get_filename_component(_BOOST_LIBDIR "${_BOOST_CMAKEDIR}/../" ABSOLUTE) ** Correct
使用的编译命令:
b2 --build-dir=builds --stagedir=../boost_1_80_0 toolset=gcc --without-python
未执行库安装,仅编译后移动文件,无法找到构建时设置包含路径的入口。
原因分析
你用的是b2 stage目标(默认隐式执行),该目标仅负责编译库文件并输出到stagedir/lib,不会处理头文件的复制或目录结构整理。Boost的头文件原本在源码根目录的boost文件夹,而stage过程中生成的CMake配置文件会基于stagedir的相对路径推导头文件位置,导致最终路径缺失/include。
解决方案
方案1:使用b2 install替代stage(推荐)
install目标会自动整理目录结构,将头文件复制到prefix/include,库文件到prefix/lib,并生成正确的CMake配置:
- 清理之前的构建产物:
b2 clean - 执行install命令,指定最终的安装路径:
执行后,b2 --build-dir=builds toolset=gcc --without-python install --prefix=/<networkpath>/BOOST/boost_1_80_0/<networkpath>/BOOST/boost_1_80_0下会自动生成include和lib目录,CMake配置文件也会正确指向include路径。
方案2:手动修复(若坚持使用stage)
- 整理头文件目录:
将Boost源码根目录下的boost文件夹(所有头文件)复制到目标路径的include目录:mkdir -p /<networkpath>/BOOST/boost_1_80_0/include cp -r /path/to/boost/source/boost /<networkpath>/BOOST/boost_1_80_0/include/ - 修改CMake配置文件:
找到/<networkpath>/BOOST/boost_1_80_0/lib/cmake/Boost-1.80.0/下的相关配置文件(如BoostConfig.cmake),将_BOOST_INCLUDEDIR的定义修改为:
或者在你的项目CMakeLists.txt中手动指定包含路径:get_filename_component(_BOOST_INCLUDEDIR "/<networkpath>/BOOST/boost_1_80_0/include" ABSOLUTE)set(BOOST_INCLUDE_DIR "/<networkpath>/BOOST/boost_1_80_0/include") find_package(Boost REQUIRED COMPONENTS [你的组件名]) include_directories(${BOOST_INCLUDE_DIR})
内容的提问来源于stack exchange,提问作者jslmsca
相关产品推荐
相关产品推荐

