如何在CMake中使用Conan tool_requires管理的avrogencpp工具?
在Conan v2中正确引用libavrocpp的avrogencpp工具(CMake)
问题场景
Linux下使用Conan v2管理依赖的C项目,已在conanfile.py中配置了libavrocpp/1.11.3作为依赖及构建依赖,需要在CMake中调用该包的avrogencpp工具从Avro schema生成C类,希望避免硬编码工具路径(防止版本升级或缓存结构变更导致失效),同时想知道是否存在类似CMake FindProtobuf定义的protoc相关符号的变量来引用该工具。
解决方案
1. 确认Conan依赖配置(关键前提)
在Conan 2.x中,推荐将构建工具类依赖声明为tool_requirements(替代旧版build_requires),确保conanfile.py配置正确:
from conan import ConanFile class YourProjectConan(ConanFile): settings = "os", "compiler", "build_type", "arch" # 声明为构建工具依赖 tool_requirements = "libavrocpp/1.11.3" # 如果项目运行时也依赖libavrocpp,补充普通依赖 requirements = "libavrocpp/1.11.3"
2. CMake中引用avrogencpp工具
Conan 2.x会通过生成的conan_toolchain.cmake自动注入工具路径,libavrocpp包会导出类似AVROGENCPP_EXECUTABLE的CMake变量(和FindProtobuf的PROTOBUF_PROTOC_EXECUTABLE逻辑一致),直接使用该变量即可:
cmake_minimum_required(VERSION 3.20) # 必须先指定Conan toolchain文件(建议在project前设置) set(CMAKE_TOOLCHAIN_FILE ${CMAKE_BINARY_DIR}/conan_toolchain.cmake) project(YourProject) # 查找libavrocpp包,确保变量被导入 find_package(libavrocpp REQUIRED) # 验证工具路径(可选,用于调试) message(STATUS "avrogencpp工具路径:${AVROGENCPP_EXECUTABLE}") # 使用avrogencpp生成C++类 add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/schema_generated.h ${CMAKE_CURRENT_BINARY_DIR}/schema_generated.cc COMMAND ${AVROGENCPP_EXECUTABLE} --input ${CMAKE_CURRENT_SOURCE_DIR}/your_schema.avsc --output ${CMAKE_CURRENT_BINARY_DIR} --language c++ DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/your_schema.avsc COMMENT "从Avro schema生成C++代码" ) # 将生成的代码加入编译目标 add_executable(your_app main.cpp ${CMAKE_CURRENT_BINARY_DIR}/schema_generated.cc) target_include_directories(your_app PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) # 链接libavrocpp库 target_link_libraries(your_app PRIVATE libavrocpp::libavrocpp)
3. 正确执行构建流程
先通过Conan生成toolchain和依赖信息:
conan install . --output-folder=build --build=missing
再执行CMake配置和构建:
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release cmake --build build
关键说明
- 无需硬编码路径:Conan会根据依赖版本、缓存结构自动维护
AVROGENCPP_EXECUTABLE变量的指向,升级libavrocpp版本时,只要重新执行conan install,变量会自动更新到新工具的路径。 - 符号存在性:
libavrocpp的Conan包(Conan Center提供的官方包)会导出AVROGENCPP_EXECUTABLE变量,作用完全类似FindProtobuf的PROTOBUF_PROTOC_EXECUTABLE,直接引用即可。
内容的提问来源于stack exchange,提问作者David Razzetti
相关产品推荐
相关产品推荐

