CMake+Conan 2.0+Boost默认cmake_exe模板依赖注入失败问题
问题原因
- Conan 2.x 完全砍掉了 Conan 1.x 里
conanbuildinfo.cmake那套直接往CMake塞全局变量的逻辑,换成了跟CMake原生包管理对齐的玩法。CMakeDeps生成器只会给每个依赖生成标准的<PackageName>Config.cmake配置文件,不会自动把CONAN_LIBS/CONAN_INCLUDE_DIRS这类变量怼进CMake全局环境。 - 用
conan new cmake_exe生成的默认CMakeLists.txt只管自己项目的代码编译,根本没加find_package(Boost REQUIRED)这种指令——CMake不知道要去找Conan装的Boost,自然找不到头文件和库路径。
解决办法
方案一:跟着Conan 2的设计走(推荐)
这其实不算“手动添加”,只是加一行标准的CMake指令,完全符合官方规范,而且不用硬编码路径:
在你的CMakeLists.txt里,project()指令之后加上:
find_package(Boost REQUIRED)
然后把Boost链接到你的目标上:
add_executable(${PROJECT_NAME} src/main.cpp) # 如果只用到Boost头文件,链接Boost::boost即可 target_link_libraries(${PROJECT_NAME} PRIVATE Boost::boost) # 要是用到了具体组件(比如filesystem、thread),就改成对应的组件名 # target_link_libraries(${PROJECT_NAME} PRIVATE Boost::filesystem)
再跑conan build .,CMake会自动通过Conan生成的Boost配置文件找到依赖路径,不用你手动设置任何路径变量。
方案二:模拟Conan 1.x的全局变量效果(满足你不想写find_package的需求)
如果你就是想复刻Conan 1.x那种“不用管依赖,直接编译”的体验,可以这么做:
- 修改
conanfile.py,加上VirtualBuildEnv生成器:
from conan import ConanFile from conan.tools.cmake import CMakeToolchain, CMake, cmake_layout, CMakeDeps class CmakeExeConan(ConanFile): name = "cmake_exe" version = "0.1" package_type = "application" settings = "os", "compiler", "build_type", "arch" options = {"shared": [True, False], "fPIC": [True, False]} default_options = {"shared": False, "fPIC": True} # 添加上VirtualBuildEnv生成器 generators = "CMakeDeps", "CMakeToolchain", "VirtualBuildEnv" def requirements(self): self.requires("boost/[>=1.82.0]") def layout(self): cmake_layout(self) def build(self): cmake = CMake(self) cmake.configure() cmake.build()
- 执行
conan build .之前,先激活Conan生成的虚拟环境脚本:- Windows PowerShell:
.\build\<你的编译类型,比如Release>\conanbuildenv.ps1 - Windows Cmd:
.\build\<编译类型>\conanbuildenv.cmd - Linux/macOS:
source build/<编译类型>/conanbuildenv.sh
- Windows PowerShell:
- 激活后,CMake会自动读取环境变量里的头文件和库路径,此时不用改
CMakeLists.txt,直接编译就能找到Boost。
注意事项
- 方案二只是权宜之计,它绕开了CMake原生的包管理逻辑,项目移植或者换依赖的时候容易出问题,不推荐长期用。
- 如果你用Visual Studio,可以直接打开Conan生成的
build/<编译类型>/CMakeLists.txt.user文件,或者用CMake-GUI加载build目录生成VS项目,依赖路径会自动注入进去。
内容的提问来源于stack exchange,提问作者pandaman1234
相关产品推荐
相关产品推荐

