如何查找Cmake构build系统的所有* .c文件

我想find一个目录下的所有.c文件,并将它们全部添加到SRC文件中,以便在cmake中进行编译。 我怎么能在CMakeList.txt中做到这一点。

对于我可以创build的常规makefile

SPECIFIED_SRC_FILE = $(foreach d,$(SPECIFIED_SRC_DIRS),$(wildcard $(addprefix $(d)/*,*.c))) 

但我不知道如何在CMakeList.txt中做这样的事情。

尝试这个:

AUX_SOURCE_DIRECTORY

查找目录中的所有源文件。

 AUX_SOURCE_DIRECTORY(dir VARIABLE) 

收集指定目录中所有源文件的名称,并将列表存储在提供的variables中。 此命令旨在供使用显式模板实例化的项目使用。 模板实例化文件可以存储在“模板”子目录中并使用此命令自动收集,以避免手动列出所有实例。

使用这个命令避免为库或可执行目标写入源文件的列表是诱人的。 虽然这似乎工作,但CMake无法生成一个构build系统,知道何时添加一个新的源文件。 通常生成的构build系统知道何时需要重新运行CMake,因为CMakeLists.txt文件被修改为添加新的源。 当源文件刚被添加到目录而不修改这个文件时,就不得不手动重新运行CMake来生成包含新文件的生成系统。

那么好的旧的globbing呢?

 FILE(GLOB MyCSources *.c) ADD_EXECUTABLE(MyExecutable ${MyCSources}) 

是的,你有两个select。 让我们假设你的文件夹结构类似于这个。

 ├── autopilot │  ├── _AutoPilot.cpp │  ├── _AutoPilot.h │  └── action │  ├── ActionBase.cpp │  ├── ActionBase.h │  ├── APcopter │  │  ├── APcopter_avoid.cpp │  │  ├── APcopter_avoid.h 

如果您要使用AUX_SOURCE_DIRECTORY ,则必须为每个子目录添加CMakeLists.txt。 那么你必须包含并链接所有这些子目录。 这是一个相当困难的任务。 所以,你可以让GLOB很轻松地完成这项工作。 这是如何完成的。

  file(GLOB autopilot_sources ./*.cpp ./*/*.cpp ./*/*/*.cpp ./*/*/*/*.cpp ./*.c ./*/*.c ./*/*/*.c ./*/*/*/*.c) SET( autopilot ${autopilot_sources}) 

如果你想使用上面的源代码创build一个库,这是命令:

  ADD_LIBRARY ( autopilot ${autopilot}) TARGET_LINK_LIBRARIES ( autopilot) 

如果你想使用上面的源代码创build一个可执行文件,这是命令:

  ADD_EXECUTABLE(autopilot ${autopilot}) 

您可以使用AUX_SOURCE_DIRECTORY作为描述的@whitequark,但它不会像您期望的那样真正起作用,因为CMake将无法确定何时添加新文件(这与使用通配符有关)。

GLOB_RECURSErecursion示例

它基本上使*也进入子目录:

 cmake_minimum_required(VERSION 3.0) file(GLOB_RECURSE SOURCES RELATIVE ${CMAKE_SOURCE_DIR} "src/*.c") add_executable(main ${SOURCES}) 

然后我们的来源可以被定位为例如:

 src/main.c src/d/ac src/d/ah 

main.c使用#include "d/ah"ac使用#include "ah"

在CMake的顶层使用GLOB_RECURSE (即"*.c"而不是"src/*.c" )可能是一个坏主意,因为它可以拾取CMake本身生成的.c文件,放在build/

在GitHub上运行的例子。