You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 19:44:59