Conan 2.0集成CMake时未生成conan_deps.cmake及CONAN_INCLUDE_DIRS为空
Conan 2.0与CMake集成构建问题
问题现象
- 执行命令
conan install . --output-folder=cmake-build-debug -g CMakeToolchain -g CMakeDeps后,仅生成conan_toolchain.cmake,未生成预期的conan_deps.cmake ${CONAN_INCLUDE_DIRS}变量为空,无法正确添加依赖的头文件目录- 此前使用Conan 1.x时,通过
cmake生成器、在CMakeLists.txt中调用conan_basic_setup()并加载conanbuildinfo.cmake可正常工作
顶层CMakeLists.txt内容
cmake_minimum_required (VERSION 3.10) set (CMAKE_CXX_STANDARD 17) project (Ares) include(${CMAKE_BINARY_DIR}/conan_toolchain.cmake) include(${CMAKE_BINARY_DIR}/conan_deps.cmake) # 找不到该文件 #conan_basic_setup() message(STATUS "Conan Include Dirs: ${CONAN_INCLUDE_DIRS}") ## 输出为空 message(STATUS "Binary Dirs: ${CMAKE_BINARY_DIR}") include(${CMAKE_BINARY_DIR}/conan_deps.cmake) get_cmake_property(_variableNames VARIABLES) list (SORT _variableNames) foreach (_variableName ${_variableNames}) message(STATUS "${_variableName}=${${_variableName}}") endforeach() unset(BUILD_TEST CACHE) option(BUILD_TEST "Build the unit tests" ON) if(BUILD_TEST) enable_testing() message(STATUS "Building Unit Tests") endif() if(NOT (UNIX AND CMAKE_COMPILER_IS_GNUCXX)) message(FATAL_ERROR "Must compile on UNIX with GCC" ) endif() include(CheckCXXCompilerFlag) CHECK_CXX_COMPILER_FLAG("-march=native" COMPILER_SUPPORTS_MARCH_NATIVE) if(COMPILER_SUPPORTS_MARCH_NATIVE) message(STATUS "Using Native Architecture Flag") add_compile_options("-march=native") endif() # 添加编译警告 add_compile_options("-Wall" "-Wextra" "-Wno-unknown-pragmas" "-Wno-int-in-bool-context" "-Wno-unused-parameter" "-Werror=switch" "-Wno-empty-body") # Release模式启用O3优化 add_compile_options("$<$<CONFIG:RELEASE>:-O3>") # Debug模式启用覆盖率统计 add_compile_options("$<$<CONFIG:DEBUG>:--coverage>") link_libraries("$<$<CONFIG:DEBUG>:--coverage>") if(NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") message(WARNING "你正在使用非推荐编译器!仅GCC经过编译测试。") endif() add_definitions(-DSBE_HAVE_CMATH) #add_definitions(-DSBE_NO_BOUNDS_CHECK) add_definitions(-DHFFIX_NO_BOOST_DATETIME) #add_definitions(-DQL_USE_STD_SHARED_PTR) include( modules/VersionFromGit.cmake ) add_subdirectory (schemas) add_subdirectory (platform)
命令输出摘要
======== Finalizing install (deploy, generators) ======== conanfile.txt: Writing generators to /home/user/dev/myapp/cmake-build-debug conanfile.txt: Generator 'CMakeDeps' calling 'generate()' conanfile.txt: Generator 'CMakeToolchain' calling 'generate()' conanfile.txt: CMakeToolchain generated: conan_toolchain.cmake conanfile.txt: Preset 'conan-release' added to CMakePresets.json. Invoke it manually using 'cmake --preset conan-release' if using CMake>=3.23 conanfile.txt: If your CMake version is not compatible with CMakePresets (<3.23) call cmake like: 'cmake <path> -G "Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=/home/user/dev/myapp/cmake-build-debug/conan_toolchain.cmake -DCMAKE_POLICY_DEFAULT_CMP0091=NEW -DCMAKE_BUILD_TYPE=Release' conanfile.txt: CMakeToolchain generated: CMakePresets.json conanfile.txt: CMakeToolchain generated: ../CMakeUserPresets.json conanfile.txt: Generating aggregated env files conanfile.txt: Generated aggregated env files: ['conanbuild.sh', 'conanrun.sh'] Install finished successfully
解决方案
1. 理解Conan 2.0的CMakeDeps生成逻辑
Conan 2.0的CMakeDeps生成器不会生成单一的conan_deps.cmake,而是为每个依赖生成单独的<dependency>-config.cmake或<dependency>-targets.cmake文件,存放在输出目录的lib/cmake/<dependency>子目录下。CMake会通过find_package()自动加载这些文件,不需要手动包含。
2. 调整CMakeLists.txt的集成方式
- 移除手动包含
conan_deps.cmake的代码 - 放弃使用
CONAN_INCLUDE_DIRS这类全局变量,改用Conan生成的目标链接方式:比如依赖fmt库时,直接用target_link_libraries(your_target PRIVATE fmt::fmt),CMake会自动处理头文件目录、库路径和链接参数 - 确保CMake调用时正确指定工具链文件,或者使用Conan生成的CMake Preset
修改后的CMakeLists.txt关键部分示例:
cmake_minimum_required (VERSION 3.10) set (CMAKE_CXX_STANDARD 17) project (Ares) # 仅需包含工具链文件,CMakeDeps的配置会自动被find_package识别 include(${CMAKE_BINARY_DIR}/conan_toolchain.cmake) # 根据conanfile.txt中的依赖查找对应包 find_package(fmt REQUIRED) find_package(spdlog REQUIRED) # ... 保留原有其他配置 ... # 为目标链接依赖库 add_executable(ares_main src/main.cpp) target_link_libraries(ares_main PRIVATE fmt::fmt spdlog::spdlog)
3. 正确的构建流程
- 若使用CMake 3.23+,推荐用Conan生成的Preset启动构建:
cmake --preset conan-debug cmake --build --preset conan-debug - 若CMake版本低于3.23,手动指定工具链文件:
cmake -S . -B cmake-build-debug -DCMAKE_TOOLCHAIN_FILE=cmake-build-debug/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Debug cmake --build cmake-build-debug
4. 关于CONAN_INCLUDE_DIRS为空的问题
Conan 2.0已废弃CONAN_INCLUDE_DIRS这类全局变量,转而采用目标导向的依赖管理模式。所有依赖的头文件、库路径都会通过目标的INTERFACE_INCLUDE_DIRECTORIES等属性自动传递,无需手动设置。
内容的提问来源于stack exchange,提问作者rocketman
相关产品推荐
相关产品推荐

