首页 > 解决方案 > 我可以简化这种方法来安装和导出基于 CMake 的项目吗?

问题描述

注意:重新问一个写得不好的早期问题。

使用 CMake 的包/库开发人员应该如何让他们的包有效地安装在系统上,以及在另一个基于 CMake 的项目中轻松集成/使用?

根据 Daniel Pfeiffer 的经常链接到的谈话此处的幻灯片),这是一个如何完成的示例:

CMakeLists.txt

find_package(Bar 2.0 REQUIRED)
add_library(Foo ...)
target_link_libraries(Foo PRIVATE Bar::Bar)

install(TARGETS Foo EXPORT FooTargets
    LIBRARY DESTINATION lib
    ARCHIVE DESTINATION lib
    RUNTIME DESTINATION bin
    INCLUDES DESTINATION include
)

install(EXPORT FooTargets
    FILE FooTargets.cmake
    NAMESPACE Foo::
    DESTINATION lib/cmake/Foo
)

在第二个文件中(哪个?):

include(CMakePackageConfigHelpers)
write_basic_package_version_file("FooConfigVersion.cmake"
    VERSION ${Foo_VERSION}
    COMPATIBILITY SameMajorVersion
)
install(FILES "FooConfig.cmake" "FooConfigVersion.cmake"
    DESTINATION lib/cmake/Foo
)

在第三个文件中(哪个?):

include(CMakeFindDependencyMacro)
find_dependency(Bar 2.0)
include("${CMAKE_CURRENT_LIST_DIR}/FooTargets.cmake")

所以,我们有:

我一直对此感到困惑和困惑。Pfeifer 说“我希望这更容易;但至少它是直截了当的”——这并不是那么直截了当。

问题:

标签: c++cmakepackagebuildconfiguration

解决方案


总结:大约一年前,当我尝试这样做时,我的设置非常相似。

在源中至少有 2 个文件:一个 CMakeLists.txt 和一个 config.cmake.in。然后我让 CMake 使用 configure_package_config_file() 生成 myproject-config.cmake。

在安装的文件中,我还有导出的目标、配置和版本文件。

作为一个建议,看看你是否也可以使用 configure_package_config_file() 重用一个 config.cmake.in。


推荐阅读