1

わかりました、それは私を夢中にさせているので、皆さんに助けを求めるつもりです。現時点ではかなり小さい新しいプロジェクトを立ち上げようとしています。

簡単にするために、私のプロジェクト構造は次のようなものです:
RootProject
- module1 (これはヘッダーのみのライブラリです)
-- include
---module1
----header files (テストしたいテンプレートを含む)
--test
---testmain.cpp (gmock とブースト ユニット テスト フレームワークを使用)
-CMakeLists.txt (1)
-module2 (別のライブラリ、module1 を使用)
--モジュール 1 と同じ構造
CMakeLists.txt (2)

したがって、ルート CMakeLists.txt と、モジュールごとにいくつかの CMakeLists.txt があります。

ルート CMakeLists.txt:
`

cmake_minimum_required(VERSION 2.8)
project(root) 

# compiler
set(CMAKE_CXX_COMPILER "g++")

# cpp flags
set(CMAKE_CXX_FLAGS "-g -Wall")
add_definitions(-std=gnu++0x)

find_package(Boost COMPONENTS system filesystem unit_test_framework REQUIRED)
set(BOOST_INCLUDES 
    ${Boost_FILESYSTEM_INCLUDE_DIR}
    ${Boost_SYSTEM_INCLUDE_DIR}
    ${Boost_UNIT_TEST_FRAMEWORK_INCLUDE_DIR}
    )

set(BOOST_LIBRARIES
    ${Boost_FILESYSTEM_LIBRARY}
    ${Boost_SYSTEM_LIBRARY}
    ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}
    )

# Build with system gmock and embedded gtest
set (GMOCK_INCLUDE_DIR "C:/GMock/gmock-1.6.0/include")
set(GMOCK_LIBRARIES gmock gmock_main)

enable_testing()

# Add sub-directories
add_subdirectory (module1) 
add_subdirectory (module2)
add_subdirectory (module3)

add_executable(root main.cxx)

しかし、module1 の CMakeLists.txt が機能していると、頭痛の種になります。ヘッダーのみのモジュールをテストする最も簡単なソリューションはどれですか? 助けていただければ幸いです。

4

1 に答える 1

1

最も簡単な解決策は、module1 のインクルード ディレクトリを取得するだけで、他に何もしないことです。特に、ヘッダーのみのモジュールのターゲットを作成する必要はありません。

# Add sub-directories
# add_subdirectory (module1) this we don't need
set(MODULE1_INCLUDE_DIRS "${PROJECT_SOURCE_DIR}/module1/include")
add_subdirectory (module2)
add_subdirectory (module3)

add_executable(root main.cxx)
set_property(TARGET root APPEND PROPERTY INCLUDE_DIRECTORIES ${MODULE1_INCLUDE_DIRS})

別の方法は、module1 の便利なターゲットを定義することです。残念ながら、カスタム ターゲットは過去に問題を引き起こしたので、現在私が行っていることはdummy.cpp、各ヘッダーのみのライブラリに空を配置し、そこから静的ライブラリを作成することです。これは、CMake を満足させるためだけです。これにより、次のことが可能になります。

Module1 CMakeLists

cmake_minimum_required(VERSION 2.8.11)  # 2.8.11 needed for target_include_directories

project("module1")

add_library(module1 STATIC dummy.cpp)
target_include_directories(module1 PUBLIC "${PROJECT_SOURCE_DIR}/include")

主な CMakeList

[...]

# Add sub-directories
add_subdirectory (module1) 
add_subdirectory (module2)
add_subdirectory (module3)

add_executable(root main.cxx)
target_link_libraries(root module1)   
# thanks to target_include_directories, this will line 
# pull in the correct include paths from module1 for you

これには、ユーザーがモジュールのインクルードまたはライブラリが何であるかをまったく心配する必要がないという利点があります。それらをすべて に渡すだけtarget_link_librariesで、すべてが自動的に処理されます。

于 2013-08-27T08:00:04.223 に答える