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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 11:27:35