CMake配置下Boost库仅main.cpp可访问 其他文件引入报错如何解决
C++项目多源文件引入Boost编译报错解决方案
问题原因
你当前的CMake配置仅将Boost依赖关联到了最终的可执行文件Project上,而Utils、ProjectCore这类独立编译的静态库目标自身并没有关联Boost的头文件搜索路径、编译标记和链接依赖。
编译阶段每个目标是独立处理的:
main.cpp属于Project目标,继承了Boost的所有配置,因此引入Boost正常utils.cpp属于Utils目标,没有配置Boost相关依赖,因此编译时找不到Boost头文件触发报错
修复方案
步骤1:给用到Boost的库目标关联依赖
在你当前的CMakeLists.txt中,给用到Boost功能的库添加链接配置即可,例如Utils库用到了Boost,就添加如下配置:
target_link_libraries(Utils PUBLIC Boost::system)
如果ProjectCore也用到了Boost,同步添加:
target_link_libraries(ProjectCore PUBLIC Boost::system)
这里用
PUBLIC属性的原因是:如果你的库头文件中就引入了Boost的内容,那么依赖这个库的其他目标也需要继承Boost的配置,如果仅在库的内部实现(.cpp文件)用到Boost,可以换成PRIVATE。
步骤2:统一C++标准配置(可选优化)
你当前仅给Project目标设置了C++17标准,建议全局统一标准,避免不同目标用不同标准编译出现兼容问题,在CMakeLists.txt开头添加如下配置即可:
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF)
步骤3:重新生成编译缓存
修改完成后清理旧的build目录,重新执行编译流程即可:
rm -rf build mkdir build && cd build && cmake .. bear -- make -C build
内容的提问来源于stack exchange,提问作者Daniel Boll
相关产品推荐
相关产品推荐

