使用CMake的一个可执行文件的多个源目录

时间:2013-07-29 20:55:40

标签: cmake subdirectory

我希望我的源在许多子目录中组织,但能够创建单个可执行文件而无需为每个子目录构建库。 CMake能做到吗?类似的东西:

ADD_EXECUTABLE(foo a / main.cpp a / other.cpp b / another.cpp)

这么简单吗?使用/作为目录分隔符而不管平台?

3 个答案:

答案 0 :(得分:9)

这是我的简单例子

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})

答案 1 :(得分:4)

另一个(对于大代码库来说更好)变体是为每个子目录使用单独的CMakeLists.txt,您可以使用target_sources隔离将目录的源添加到目标,也许某些特定的配置设置\包括这些来源的条件:

target_sources( SomeExeOrLib PRIVATE source1.h source1.cpp )

此处您还可以通过指定PRIVATE来更好地控制范围,其他选项包括INTERFACEPUBLIC。详情请见https://cmake.org/cmake/help/v3.3/command/target_sources.html

答案 2 :(得分:1)

是的,那会有用。

更新: 以下内容不再相关,因为现在CMake支持响应文件,因此命令行不会出现问题。< / em>的

但是,当文件数量过高时,您可能会遇到麻烦,并且命令行太长,编译器无法处理它。一种可能的解决方案是为每个子目录添加一个静态库,将它们添加到列表“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