2017-02-19 106 views
2

TL; DRCMake的添加庫子目錄

使用cmake,我怎麼能包含子目錄到庫中,使得它們可以包含不引用它們所在的目錄?

末TL; DR

在試圖簡明扼要,什麼和如何,我已刪除了所有的更高層次的想法,我認爲是不必要的細節說話英寸如有需要,我會進行編輯。因此,這是我的項目結構的簡要概要。

ParentDir 
--src 
----source.cpp 
----source.h 
----entities_dir 
------entity.cpp 
------entity.h 
------CMakeLists.txt 
----CMakeLists.txt 
--CMakeLists.txt 
--main.cpp 

當前標準的,我必須在src目錄下的CMakeLists定義庫。因此,我可以通過#include包含src文件作爲#include「src/file.h」。我希望能夠對我的src子目錄中存在的頭文件做同樣的處理。

的CMakeLists.txt

cmake_minimum_required(VERSION 3.6) 
project(Project) 

add_executable(Project ${SOURCE_FILES} main.cpp) 
include_directories(src) 
add_subdirectory(src) 
target_link_libraries(Project Library) # Engine Libraries 

的src /的CMakeLists.txt

file(GLOB SOURCE_FILES *.cpp) 
file(GLOB HEADER_FILES *.h) 

add_library(Library STATIC ${SOURCE_FILES} ${HEADER_FILES}) 

的main.cpp

#include <source.h> // this works 
#include <entity.h> // this does not work but I want it to 
#include <entities/entity.h> // this works but I don't want this 
int main() {} 

我ñ確信如何完全做到這一點。我已經嘗試過GLOB_RECURSE,add_subdirectory(實體)等。我也嘗試在src/entities/CMakeLists.txt中創建一個名爲Entities的庫,並將其與link_libraries鏈接起來。這些都沒有成功。什麼是正確的方法來實現這一點,因爲我認爲我可能接近完全錯誤。

+3

在編譯器頭部搜索路徑中需要使用include_directories()調用實現的路徑。您可以將現有的include_directories(src)調用修改爲include_directories(src src/entities)。我沒有意識到這種遞歸方式,我也不推薦它。 – qexyn

+0

這樣的作品。這似乎是在挑戰我對如何使用cmake的理解。我已經看到在每個目錄中都有cmakelists這是司空見慣的事情。因爲在這種情況下,src cmakelists正在創建實際的庫,不應該父cmake只需引用src cmake而不需要src子目錄的知識? – tramstheman

+0

@qexyn如果你想留下一個答案,我會接受它。 – tramstheman

回答

1

在編譯器頭部搜索路徑中需要使用include_directories()調用實現的路徑。您可以修改現有的include_directories(SRC)調用是:

include_directories(src src/entities) 

此外,該SO職位是相關的,值得一讀:Recursive CMake search for header and source files。有一個來自CMake網站本身的摘錄,建議不要使用文件(GLOB ...),該文件可用於推薦一般的遞歸解決方案。作爲CMake的一個重要用戶,我同意反對它的論據。

0

你只需要添加:

include_directories(${CMAKE_CURRENT_LIST_DIR}) 

在每一個的CMakeLists.txt在您的層次結構。它只會調用你的工具鏈並傳遞參數給它,而你的工具鏈並不知道它正在被CMake調用,或者你的項目結構。因此,您需要告訴工具鏈在何處查找包含文件。

雖然在每個子目錄中都有一個CMakeLists.txt是司空見慣的事情,但這並不是一個必要條件。您的src目錄中的CMakeLists.txt可能包含生成構建所需的全部指令。一般來說,CMakeLists.txt放在每個級別以使結構更容易管理,例如。每個目錄只需要知道它需要做什麼(可能與該目錄中的文件相關)。

+0

這不幸沒有奏效。根據評論的建議,我添加了「include_directories(src/entities)」,但是我確實在尋找一個答案,我可以只是「include_directories(src)」,並且src目錄中的CMakeLists.txt處理所有的子目錄。 – tramstheman