2017-09-19 24 views
0

私のプロジェクトには2つのユーティリティライブラリがあります。私はライブラリのCMake設定を書くための最善の方法を探しています。CMakeにライブラリを含むヘッダーを含める

/my_project 
--> CMakeLists.txt 
--> main.cpp 
--> /utils 
     --> CMakeLists.txt 
     --> common.h 
     --> /base_c 
      --> CMakeLists.txt 
      --> base_c.c 
      --> base_c.h 
     --> /base_cpp 
      --> CMakeLists.txt 
      --> base_cpp.cpp 
      --> base_cpp.hpp 

私の現在のcmakeのファイル:

/my_project/CMakeLists.txt

cmake_minimum_requared(VERSION 3.8) 
project(my_project) 

add_subdirectory(utils) 

add_executable(main main.c) 
target_link_libraries(main utils base_c base_cpp) 

/my_project/utils/CMakeLists.txt

add_subdirectory(base_c) 
add_subdirectory(base_cpp) 

add_library(utils) 
target_sources(utils PUBLIC common.h) 

/MY_PROJECT/utilsの/ base_c /CMakeLists.txt

add_library(base_c base_c.c) 
target_sources(base_c PUBLIC base_c.h) 

/my_project/utils/base_cpp/CMakeLists.txt

add_library(base_cpp base_cpp.cpp) 
target_sources(base_cpp PUBLIC base_cpp.hpp) 

find_library(BASEC base_c ../base_c) 
target_link_libraries(base_cpp BASEC) 

問題はbase_cpp見つけられませんが、base_cから含まれていることです。設定をどのように修正する必要がありますか?

私はtarget_include_directories(base_cpp PRIVATE ../base_c)と動作させることができましたが、それは醜いので、必要ではありません。INTERFACE_INCLUDE_DIRECTORIES documentationに従ってください。

+0

? 'include_directories'や' target_include_directories'を使わずに単一のライブラリをコンパイルする方法が不思議です。 – Tsyvarev

+0

@Tsyvarev私はこれについて完全に間違っているかもしれません。ライブラリの 'INTERFACE_INCLUDE_DIRECTORIES'をどのように使うことができるのか説明できますか? – voddan

+0

CMakeの後にどのビルドシステムを使用しますか? Makefiles? Visual Studioプロジェクト?ディレクトリが実際にインクルードディレクトリとして渡されるファイルを調べることはできますか? – Anedar

答えて

0

@Anedarは1ライブラリCMakeLists.txtPUBLICtarget_include_directoriesまたはINTERFACEオプションを必要とするこのような状況を解決するために、前述のように。これにより、ライブラリターゲットのINTERFACE_INCLUDE_DIRECTORIESが生成され、消費側のtarget_link_librariesによって使用されます。

私の作業構成:

/my_project/CMakeLists.txt

cmake_minimum_requared(VERSION 3.8) 
project(my_project) 

add_subdirectory(utils) 

add_executable(main main.c) 
target_link_libraries(main utils base_c base_cpp) 

/my_project/utils/CMakeLists.txt

add_subdirectory(base_c) 
add_subdirectory(base_cpp) 

add_library(utils) 
target_sources(utils PUBLIC common.h) 
target_include_directories(utils INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) 

/MY_PROJECT/utilsの/ base_c/CMakeLists。TXT

add_library(base_c base_c.c) 
target_sources(base_c PUBLIC base_c.h) 
target_include_directories(base_c INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) 

/my_project/utils/base_cpp/CMakeLists.txt

add_library(base_cpp base_cpp.cpp) 
target_sources(base_cpp PUBLIC base_cpp.hpp) 
target_include_directories(base_cpp INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) 

target_link_libraries(base_cpp base_c) 
INTERFACE_INCLUDE_DIRECTORIESのドキュメントは `target_include_directories`が必要とされていないことを意味どのよう
1

target_include_directories)は、お探しのものですが、PRIVATEオプションはありません。

PRIVATEオプションは、そのターゲットに使用するディレクトリです target_include_directories() documentationによると、INTERFACEは依存ターゲットによって使用されるディレクトリのためのものであり、PUBLICは両方のためのものです。

私は/my_project/utils/base_c/CMakeLists.txt

target_include_directories(base_c INTERFACE ${CMAKE_CURRENT_LIST_DIR}) 

にあなたが「リンク」、それが属していると、それに依存するすべてのターゲットが自動的にディレクトリが含まれる対象に含めるディレクトリこの方法を使用することをお勧め。

さらに、パブリックヘッダーを自分のサブフォルダ/my_project/utils/base_c/base_c/に移動し、#include "base_c/base_c.h"として含めることもできます。これにより、ヘッダーに「名前空間」のようなものが導入され、異なるプロジェクトの同じ名前のヘッダーがあいまいにならないようになります。

+0

'base_cpp'の消費側で何かする必要はありますか?現在 'find_library'は' BASEC-NOTFOUND'を返します – voddan

+1

あなたは同じプロジェクト内でfind_libraryを必要としません。 'target_link_libraries(base_cpp base_c)'を使用してください。 – Anedar

+0

これを行いましたが、ヘッダーを解決できません。たぶん 'target_include_directories(base_cpp )'が必要でしょうか? – voddan

関連する問題