1. ホーム
  2. c++

[解決済み] cmakeでヘッダのみのライブラリを作るには?

2022-02-15 13:18:33

質問

cmakeで、すべてのc++ファイルを1つのヘッダーに集めるプロジェクトを作るにはどうしたらいいですか?

このようなプロジェクト構成になっています。

/
  project/
     folder1/
         file.cpp
         file.hpp
     folder2/
         ...etc
     CMakeLists.txt
  tests/
     test.cpp
     CMakeLists.txt
CMakeList.txt

ルート cmakelists.txt

cmake_minimum_required (VERSION 3.8)

project ("CMakeProject"
    LANGUAGES C CXX)

set(CMAKE_EXECUTABLE_SUFFIX ".exe")

include(GNUInstallDirs)

add_subdirectory ("project")


option(ENABLE_TESTING OFF)

if (ENABLE_TESTING)
    enable_testing()
    add_subdirectory("tests")
endif()

プロジェクト内の CMakeLists.txt

cmake_minimum_required (VERSION 3.8)

file(GLOB projectSRC
    "*/*.cpp"
    "*/*.hpp"
    "*.cpp"
    "*.hpp"
)

add_library(project INTERFACE)

message(STATUS "CMake inatall directory: " ${CMAKE_INSTALL_INCLUDEDIR})
target_include_directories(project 
    INTERFACE 
        $<BUILD_INTERFACE:${PROJECT_INCLUDE_DIR}>
        $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)

とテストcmakelist.txt

cmake_minimum_required (VERSION 3.8)

# install Catch2 testing library
# (https://github.com/catchorg/Catch2/blob/master/docs/cmake-integration.md#installing-catch2-from-git-repository or use packet manager)
find_package(Catch2 REQUIRED)

file(GLOB testSRC
    "*.cpp"
)

add_executable(tests ${testSRC})

target_link_libraries(tests
    Catch2::Catch2
    project)

include(CTest)
include(Catch)
catch_discover_tests(tests)

1つのヘッダーを生成し、それを(テストや他のプロジェクトで)使用する方法、またはこのライブラリがテンプレートを持つことができるようにするにはどうすればよいですか?前者の方がよいでしょう。

解決方法は?

<ブロッククオート

cmakeでヘッダのみのライブラリを作るには?

こんな感じで。

add_library(project INTERFACE)
target_include_directories(project INTERFACE .)

次に、そのライブラリを使用するターゲットで

target_link_libraries(dependee
    PUBLIC/INTERFACE/PRIVATE # pick one
    project)

というように、ヘッダを含めるようにします。

#include <project/folder1/file.hpp>