如何查找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_RECURSE
recursion示例
它基本上使*
也进入子目录:
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上运行的例子。