【问题标题】:Can I make conan usage optional to users of my library that uses conan?我可以让使用柯南的图书馆的用户选择使用柯南吗?
【发布时间】:2021-09-30 15:14:53
【问题描述】:

使用柯南开发图书馆似乎迫使图书馆的用户也使用柯南。有没有一种(标准)方法可以用 protobuf 替换 Targets.cmake 中的 CONAN_PKG::protobuf 引用?

上下文

我正在使用cmake构建一个使用protobuf的静态C++库,使用conan来处理protobuf依赖,即

target_link_libraries(mylib
    PUBLIC
        CONAN_PKG::protobuf
    )

当我在本地安装这个库时,即ninja install 创建的MylibTargets.cmake 包含对CONAN_PKG::protobuf 的引用

set_target_properties(Mylib::Mylib PROPERTIES
  INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include/mylib;${_IMPORT_PREFIX}/include"
  INTERFACE_LINK_LIBRARIES "CONAN_PKG::protobuf"

这会强制我的库的用户使用 conan 来解决 CONAN_PKG::protobuf 依赖项。 (我希望库的用户能够使用 protobuf 头文件)。

我正在使用

install(EXPORT MylibTargets
    FILE MylibTargets.cmake
    NAMESPACE Mylib::
    DESTINATION lib/cmake/mylib
    )

生成 MylibTargest.cmake

【问题讨论】:

    标签: c++ cmake conan


    【解决方案1】:

    是的,所有现代 CMake 集成都可以实现某种程度的透明集成。第一次尝试是cmake_find_packagecmake_find_package_multi,但最现代的是:

    • CMakeDeps:see docs 生成xxx-config.cmake 脚本,所以消费者可以做一个普通的find_package(protobuf ...)
    • CMakeToolchain:see docs 生成一个conan_toolchain.cmake 以帮助将柯南设置映射到 CMake 语法(并且可以与 -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake 一起使用

    通过这种集成,可以使 CMakeLists.txt 与柯南完全无关。这种集成将成为柯南 2.0 中的标准集成。

    【讨论】:

    • 当我在这里收到关于柯南的通知时,drodri 已经在 10 分钟前回复了。比利小子,柯南 stackoverflow 中最快的答案!
    • 一个后续问题:我是否正确理解建议的解决方案意味着我的 CMakeLists.txt 不使用 CONAN_PKG 等?相反,他们会使用 find_package(...)?
    • 是的,这正是重点。消费者 CMakeLists.txt 完全不可知,没有 CONAN_PKG,就像 find_package(protobuf....)target_link_libraries(myapp ... protobuf::protobuf)
    猜你喜欢
    • 2021-07-13
    • 1970-01-01
    • 2021-12-15
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多