我希望我的源代码组织在多个子目录中,但能够创建单个可执行文件,而无需为每个子目录构建库。CMake 可以做到这一点吗?就像是:
ADD_EXECUTABLE(foo a/main.cpp a/other.cpp b/another.cpp)
就这么简单吗?无论平台如何,都将 / 用作目录分隔符?
我希望我的源代码组织在多个子目录中,但能够创建单个可执行文件,而无需为每个子目录构建库。CMake 可以做到这一点吗?就像是:
ADD_EXECUTABLE(foo 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})
另一个(对于大型代码库来说可能更好)变体是CMakeLists.txt
为每个子目录使用一个单独的子目录,您可以在其中隔离将目录的源添加到目标,target_sources
并且可能使用一些特定的配置设置\包括这些源的条件:
target_sources( SomeExeOrLib PRIVATE source1.h source1.cpp )
在这里,您还可以通过指定 来更好地控制范围PRIVATE
,其他选项是INTERFACE
or PUBLIC
。在此处查看详细信息:https ://cmake.org/cmake/help/v3.3/command/target_sources.html
是的,那会奏效。
更新:以下内容不再相关,因为现在 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