web-dev-qa-db-ja.com

インターフェースのみのライブラリである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)

http://foonathan.net/blog/2016/03/03/cmake-install.html から

ライブラリをインストールして、別のCMakeプロジェクトから使用できるようにするためのいくつかの手順があることを学びました。最初に「インストール」する必要があり、次に「エクスポート」する必要があります。次に、find_packageがありますが、最初の2つのステップを終えたら、その橋を渡ります。

したがって、例に従って、CMakeファイルの最後に以下を追加できることを確認します。

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

ただし、ガイドでは、TARGETSでのインストールの使用についても説明し、ターゲットのインストールコマンドにEXPORTを追加しています。

これのうちどれだけが、ヘッダー以外にコンパイルされたファイルのコードがないヘッダーのみのライブラリに適用されますか?

http://foonathan.net/blog/2016/03/03/cmake-install.html インターフェースのみのライブラリに記載されている手順を適用するにはどうすればよいですか?プロジェクトに.cppファイルがないため、どの命令が適用され、どの命令が適用されないのか疑問に思っています。

9
Ward9250

これを試して:

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)

cmake/mylibConfig.cmake.inの内容はこれだけにする必要があります

@PACKAGE_INIT@

include("${CMAKE_CURRENT_LIST_DIR}/mylibTargets.cmake")
check_required_components("@PROJECT_NAME@")

これをすべて行うと、ヘッダーのみのライブラリが「インストール可能」になるだけでなく、「検索可能」になります。ユーザーは次のようにライブラリをインポートできます。

find_package(mylib CONFIG REQUIRED)
target_link_libraries(MyApp mylib) # installed include/ path automatically added
11
mchiasson

https://stackoverflow.com/a/49143782/2119944 へのほんの少しの追加

おそらくcmake/mylibConfig.cmake.inは次のようになります。

@PACKAGE_INIT@

include("${CMAKE_INSTALL_PREFIX}/lib/cmake/mylib/mylibTargets.cmake")
check_required_components("@PROJECT_NAME@")

それ以外の場合は、ローカルプロジェクトディレクトリを指します。

0