2017-09-28 39 views
1

我有一些問題,爲我的項目創建CMakeList。我有以下結構:CMakeList只是頭項目,並在另一個項目中使用它

ProjectAB 
| 
|--- include 
|  |--- A.h 
|  |--- B.h 
| 
| --- CMakeList.txt 

Project1 
| 
|--- include 
|  |--- src1.h 
| 
|--- src 
|  |--- src1.cpp (#include "src1.h"; #include "A.h"; #include "B.h") 
| 
| --- CMakeList.txt 

ProjectAB只是通過在頭組成的,所以我在CMake的指南和一些其他來源(link)一直在讀,最後我寫了下面CMakeList吧:

cmake_minimum_required(VERSION 3.6.1) 

project(lib_projectAB VERSION 1.0.0 LANGUAGES CXX) 

add_library(projectAB INTERFACE) 

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) 

target_include_directories(projectAB 
    INTERFACE 
     A.h 
     B.h 
) 

現在我想用ProjectAB的頭在PROJECT1。由於不相關的原因,我必須安裝它們。我不確定這兩個項目的CMakeLists應該如何。

我想這對於PROJECT1

cmake_minimum_required(VERSION 3.6.1) 

project(lib_project1 VERSION 1.0.0 LANGUAGES CXX) 

add_subdirectory(src) 

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../projectAB/include) 

add_library(project1 
    STATIC 
     src1.h 
     src1.cpp 
) 

target_link_libraries(project1 
    PUBLIC 
     third_party_LIBRARIES 
     lib_projectAB 
) 

install(
    FILES 
     src1.h 
     A.h 
     B.h 
    DESTINATION 
     . 
) 

但它不是優雅,也不工作。

這樣做的正確方法是什麼?

回答

1

首先,你標記錯誤目錄的位置包括文件:

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../projectAB) 

因爲根據你的目錄樹,這些文件都直接位於projectAB /包括,不projectAB。

根據項目AB的CMakeLists的位置,您可能會遇到類似的問題。

此外,您沒有將projectAB的CMakeLists用於構建project1,但是您應該在其中指定include目錄,而不是實際的頭文件 - 而且簡單的include_directories調用也不是必需的:通過爲目標指定接口包含目錄,取決於該目標的任何東西都會將這些目錄添加到它的包含路徑中。

另一個問題是你的project1實際上並不依賴於projectAB - 這就是爲什麼你要手動修改include路徑。

理想情況下,你會想遵循兩個可能的路徑:

  • 如果兩個項目大多是單獨開發,您可以使用cmake的發現包功能的PROJECT1找到projectAB
  • 如果他們通常一起開發(基於佈局,我假設是這種情況),您應該使用add_subdirectory將projectAB cmakelists添加到project1。之後,projectAB目標將可用,並且可以將其作爲依賴項添加到project1。

不幸的是,雖然它可以使用add_subdirectory添加目錄這是不是當前目錄的孩子,所以不推薦。

所以採用這種做法,你就必須要麼:

  • 移動projectAB是PROJECT1的子目錄
  • 或添加一個「根」 CMakeLists,增加第一projectAB,然後PROJECT1使用add_subdirectory - 這又意味着project1會使用projectAB目標。
+0

Dutow你好,首先感謝您的時間。 我更新的問題與CMakeLists的位置,並用正確的include_directories($ {} CMAKE_CURRENT_SOURCE_DIR /../ projectAB /包括)我因子評分關於你說的有關內部添加ProjectAB但我不能將其添加爲一個子目錄,因爲還有其他項目(Project2,Project3 ...)與使用ProjectAB的Project1完全相同。所以在每一個上覆制都會有點骯髒。 我也正在考慮通過CMake的製作ProjectAB「容易找到」的選項,但我想知道是否有更多的選擇。 – solosito

+0

其他最常用的選項是什麼,我也這裏提到:在含有PROJECT1和projectAB的目錄中添加一個「頂級」 cmakefile,並添加這兩個項目的子目錄。 – Dutow

相關問題