安装和导出仅限INTERFACE库,CMake

War*_*250 5 c++ install cmake

新的CMake用户在这里.

我使用以下CMake文件制作了一个简单的标题库:

cmake_minimum_required(VERSION 3.7)

project(mylib VERSION 0.1 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 14)
#add_compile_options(-Wa -aslh)


# Define the library target
add_library(mylib INTERFACE)
target_include_directories(mylib INTERFACE include/)


add_executable(mytest test/basic_checks.cpp)
target_link_libraries(mytest mylib)
Run Code Online (Sandbox Code Playgroud)

来自http://foonathan.net/blog/2016/03/03/cmake-install.html

我已经了解到安装库有几个步骤,并且可以从另一个CMake项目中使用它.首先,它必须"安装",然后必须"导出".然后是find_package,但是在我完成前两步之后我将穿过那座桥.

因此,按照示例,我想我可以将以下内容添加到我的CMake文件的底部:

# Install the header file.
install(FILES include/mylib.hpp DESTINATION "include/mylib-${PROJECT_VERSION}")
Run Code Online (Sandbox Code Playgroud)

但该指南还讨论了在TARGETS上使用install,然后将EXPORT添加到目标安装命令.

多少这个适用于一个只有头文件库,在这个库中我没有其他文件的编译代码而不是标题?

如何应用以下步骤中描述的步骤:http://foonathan.net/blog/2016/03/03/cmake-install.html 到INTERFACE only库?我的项目中缺少.cpp文件让我质疑哪些说明适用且不适用.

mch*_*son 11

试试这个:

cmake_minimum_required(VERSION 3.7)

project(mylib VERSION 0.1 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 14)
#add_compile_options(-Wa -aslh)


# Define the library target
add_library(mylib INTERFACE)
target_include_directories(mylib INTERFACE 
    $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
    $<INSTALL_INTERFACE:include>
)

include(CMakePackageConfigHelpers)
write_basic_package_version_file(
    "${PROJECT_BINARY_DIR}/mylibConfigVersion.cmake"
    VERSION 0.1
    COMPATIBILITY AnyNewerVersion
)

install(TARGETS mylib
    EXPORT mylibTargets
    LIBRARY DESTINATION lib COMPONENT Runtime
    ARCHIVE DESTINATION lib COMPONENT Development
    RUNTIME DESTINATION bin COMPONENT Runtime
    PUBLIC_HEADER DESTINATION include COMPONENT Development
    BUNDLE DESTINATION bin COMPONENT Runtime
)

include(CMakePackageConfigHelpers)
configure_package_config_file(
    "${PROJECT_SOURCE_DIR}/cmake/mylibConfig.cmake.in"
    "${PROJECT_BINARY_DIR}/mylibConfig.cmake"
    INSTALL_DESTINATION lib/cmake/mylib
)

install(EXPORT mylibTargets DESTINATION lib/cmake/mylib)
install(FILES "${PROJECT_BINARY_DIR}/mylibConfigVersion.cmake"
              "${PROJECT_BINARY_DIR}/mylibConfig.cmake"
        DESTINATION lib/cmake/mylib)
install(DIRECTORY ${PROJECT_SOURCE_DIR}/include/ DESTINATION include)


add_executable(mytest test/basic_checks.cpp)
target_link_libraries(mytest mylib)
Run Code Online (Sandbox Code Playgroud)

内容cmake/mylibConfig.cmake.in应该只是这个

@PACKAGE_INIT@

include("${CMAKE_CURRENT_LIST_DIR}/mylibTargets.cmake")
check_required_components("@PROJECT_NAME@")
Run Code Online (Sandbox Code Playgroud)

如果你做了所有这些,不仅它使你的标题库"可安装",而且它也使它"可以找到".用户可以像这样导入您的库:

find_package(mylib CONFIG REQUIRED)
target_link_libraries(MyApp mylib) # installed include/ path automatically added
Run Code Online (Sandbox Code Playgroud)

  • @陈力 这行不是为了生成`mylibTargets.cmake`。它用于导入已安装的产品。当您想将已安装的库导入另一个 cmake 项目时,当您执行 `find_package(mylib CONFIG REQUIRED)` 时,它会加载已安装的生成的 `mylibConfig.cmake`,它将打开 `mylibTargets.cmake`,它会导入所有已安装的目标进入你的项目。如果缺少这一行,这将不起作用:`target_link_libraries(MyApp mylib) # will fail here` (3认同)
  • 看起来很有希望。您能否将“mylibTargets.cmake”的内容添加到您的答案中。 (2认同)