我希望我的源在许多子目录中组织,但能够创建单个可执行文件而无需为每个子目录构建库。 CMake能做到吗?类似的东西:
ADD_EXECUTABLE(foo a / main.cpp a / other.cpp b / another.cpp)
这么简单吗?使用/作为目录分隔符而不管平台?
答案 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
来更好地控制范围,其他选项包括INTERFACE
或PUBLIC
。详情请见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