9

我希望我的源代码组织在多个子目录中,但能够创建单个可执行文件,而无需为每个子目录构建库。CMake 可以做到这一点吗?就像是:

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

就这么简单吗?无论平台如何,都将 / 用作目录分隔符?

4

3 回答 3

15

这是我的简单示例

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})
于 2013-07-30T09:56:03.943 回答
7

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

target_sources( SomeExeOrLib PRIVATE source1.h source1.cpp )

在这里,您还可以通过指定 来更好地控制范围PRIVATE,其他选项是INTERFACEor PUBLIC。在此处查看详细信息:https ://cmake.org/cmake/help/v3.3/command/target_sources.html

于 2016-08-19T14:03:00.607 回答
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 链接器问题: --whole-archive 选项

于 2013-07-30T07:11:51.960 回答