2013-07-29 95 views
3

我希望我的源代碼組織在許多子目錄中,但能夠創建單個可執行文件而無需爲每個子目錄構建一個庫。 CMake能做到這一點嗎?喜歡的東西:CMake的一個可執行文件的多個源目錄

ADD_EXECUTABLE(富A/main.cpp的A/other.cpp B/another.cpp)

是不是很簡單?用/作爲目錄分隔符而不管平臺?

+4

是的,這應該工作 – user1283078

回答

6

在這裏,我簡單例如

cmake_minimum_required(VERSION 2.8 FATAL_ERROR) 
project(foo CXX) 
# get all *.cpp files recursively 
file(GLOB_RECURSE SRC_FILES ${PROJECT_SOURCE_DIR}/*.cpp) 
add_executable(foo ${SRC_FILES}) 
+0

這是否需要「CXX」(第二行)?我可以只使用'project(foo)'嗎? – thiagowfx

+1

@thiagowfx是的,它是可選的 - 引用http:// cmake。org/cmake/help/v2.8.12/cmake.html#command:project –

1

是的,這將工作。

更新:以下內容不再相關,因爲現在CMake支持響應文件,所以不應該有太長的命令行問題。

但是,如果文件數量過高,並且命令行太長,編譯器無法處理它,則可能會出現問題。一個可能的解決方案是添加靜態庫的每個子目錄,將它們添加到列表「ALL_MY_SUB_LIBS」,並以這種方式將它們鏈接到的主要對象FOO:

target_link_libraries(foo "-Wl,--whole-archive") #like opening a parenthesis 
target_link_libraries(foo ${ALL_MY_SUB_LIBS}) 
target_link_libraries(foo "-Wl,--no-whole-archive") #like closing a parenthesis 

ld linker question: the --whole-archive option

+0

是的,我想沒有真正的理由爲什麼我不應該仍然建立每個子目錄庫,雖然我不期望有大量的來源。我只是覺得管理一個頂級CMakeLists.txt會更容易,而不是每個子目錄都有一個,全部90%相同。分組的主要原因是有些文件是特定於平臺的,有些需要不同的標誌等。 – realh

+0

實際上,在我的情況下,不使用庫是一個很好的理由;這兩個目錄相互依賴,鏈接器無法應對。否則,除了一個CMake新手的初始化問題之外,這是行得通的。 – realh

+0

@realh你試過了嗎?我們在我們的一個項目中使用了這種技術,幫助程序庫之間存在很多依賴關係,但與完整的歸檔應對程序相關聯。 – Antonio

1

另一個(用於大代碼庫可以說是較好的)變體是你使用target_sources隔離目錄的添加來源到目標使用一個單獨的CMakeLists.txt對於每個子目錄和也許一些特定的配置設置\包括那些源條件:

target_sources(SomeExeOrLib PRIVATE source1.h source1.cpp) 

在這裏你還可以通過指定PRIVATE範圍進行更多的控制,其他選項INTERFACEPUBLIC。在這裏看到的細節:https://cmake.org/cmake/help/v3.3/command/target_sources.html

+1

很棒的建議。我在https://crascit.com/2016/01/31/enhanced-source-file-handling-with-target_sources/comment-page-1/#comment-414找到了一個教程,它很好地解釋了這些細節。 –

相關問題