我希望我的源代碼組織在許多子目錄中,但能夠創建單個可執行文件而無需爲每個子目錄構建一個庫。 CMake能做到這一點嗎?喜歡的東西:CMake的一個可執行文件的多個源目錄
ADD_EXECUTABLE(富A/main.cpp的A/other.cpp B/another.cpp)
是不是很簡單?用/作爲目錄分隔符而不管平臺?
我希望我的源代碼組織在許多子目錄中,但能夠創建單個可執行文件而無需爲每個子目錄構建一個庫。 CMake能做到這一點嗎?喜歡的東西:CMake的一個可執行文件的多個源目錄
ADD_EXECUTABLE(富A/main.cpp的A/other.cpp B/another.cpp)
是不是很簡單?用/作爲目錄分隔符而不管平臺?
在這裏,我簡單例如
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})
這是否需要「CXX」(第二行)?我可以只使用'project(foo)'嗎? – thiagowfx
@thiagowfx是的,它是可選的 - 引用http:// cmake。org/cmake/help/v2.8.12/cmake.html#command:project –
是的,這將工作。
更新:以下內容不再相關,因爲現在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
另一個(用於大代碼庫可以說是較好的)變體是你使用target_sources
隔離目錄的添加來源到目標使用一個單獨的CMakeLists.txt
對於每個子目錄和也許一些特定的配置設置\包括那些源條件:
target_sources(SomeExeOrLib PRIVATE source1.h source1.cpp)
在這裏你還可以通過指定PRIVATE
範圍進行更多的控制,其他選項INTERFACE
或PUBLIC
。在這裏看到的細節:https://cmake.org/cmake/help/v3.3/command/target_sources.html
很棒的建議。我在https://crascit.com/2016/01/31/enhanced-source-file-handling-with-target_sources/comment-page-1/#comment-414找到了一個教程,它很好地解釋了這些細節。 –
是的,這應該工作 – user1283078