在 CMake 中,你可以通过手动指定路径,或者自动遍历指定路径下的源代码文件来将它们添加到 SOURCE_FILES 列表中。以下是几种实现方式:
1. 手动添加指定路径的源文件
如果你只需要添加特定路径中的几个源文件,可以直接在 CMakeLists.txt 中手动添加它们。
cmake
set(SOURCE_FILES
/path/to/source/file1.cpp
/path/to/source/file2.cpp
)
然后,你可以将这个 SOURCE_FILES 变量传递给目标,例如:
cmake
add_executable(my_executable ${SOURCE_FILES})
2. 使用 aux_source_directory() 自动添加目录中的源文件
如果你想自动将某个目录中的所有源文件(如 .cpp、.c 等)添加到 SOURCE_FILES 中,可以使用 aux_source_directory() 命令。这个命令会递归地查找指定目录下的所有源文件并添加到变量中。
cmake
aux_source_directory(/path/to/source SOURCE_FILES)
这会将 /path/to/source 目录中的所有源文件(如 .cpp、.c 文件)添加到 SOURCE_FILES 列表中。
注意:aux_source_directory() 不会递归查找子目录中的文件,仅会查找直接位于该目录中的源文件。如果需要递归查找,可以考虑下一种方法。
3. 使用 file(GLOB) 或 file(GLOB_RECURSE) 递归查找源文件
如果你想递归查找某个目录及其子目录中的所有源文件并添加到 SOURCE_FILES 中,可以使用 file(GLOB) 或 file(GLOB_RECURSE) 命令。
file(GLOB) 示例(非递归查找):
cmake
file(GLOB SOURCE_FILES /path/to/source/*.cpp)
这会将 /path/to/source 目录下的所有 .cpp 文件添加到 SOURCE_FILES 列表中,但不会递归查找子目录。
file(GLOB_RECURSE) 示例(递归查找子目录):
cmake
file(GLOB_RECURSE SOURCE_FILES /path/to/source/*.cpp)
这会递归查找 /path/to/source 目录及其所有子目录下的 .cpp 文件,并将它们添加到 SOURCE_FILES 列表中。
4. 手动将多个路径下的文件添加到 SOURCE_FILES
如果你有多个目录下的源文件需要添加到 SOURCE_FILES,可以使用 set() 或 list(APPEND) 来手动管理它们。
cmake
set(SOURCE_FILES
/path/to/source1/file1.cpp
/path/to/source2/file2.cpp
)
也可以使用 list(APPEND) 逐步添加
list(APPEND SOURCE_FILES
/path/to/source3/file3.cpp
/path/to/source4/file4.cpp
)
5. 通过函数递归添加多个目录下的源文件
如果需要递归查找多个目录下的文件,你还可以通过编写函数来更灵活地递归添加指定路径下的源文件:
cmake
function(add_sources_from_directory directory)
file(GLOB_RECURSE new_sources ${directory}/*.cpp ${directory}/*.c)
list(APPEND SOURCE_FILES ${new_sources})
set(SOURCE_FILES ${SOURCE_FILES} PARENT_SCOPE)
endfunction()
add_sources_from_directory(/path/to/source1)
add_sources_from_directory(/path/to/source2)
这个函数可以递归查找指定目录下的源文件并将其添加到 SOURCE_FILES 变量中。
6. 通过外部变量传递路径
如果你想将源文件路径通过外部变量传递给 CMake,可以使用 set() 并结合命令行选项,动态添加源文件。
bash
cmake -DSOURCE_PATH=/path/to/source ..
然后在 CMakeLists.txt 中使用该路径:
cmake
file(GLOB SOURCE_FILES ${SOURCE_PATH}/*.cpp)
总结
手动添加:适用于源文件少、路径明确的情况。
aux_source_directory():适用于非递归查找目录中的所有源文件。
file(GLOB)/file(GLOB_RECURSE):适用于递归查找指定目录及其子目录中的所有源文件。
函数式递归添加:适用于多个路径下源文件的递归查找。
外部传递路径:适用于灵活传递路径以便动态添加源文件。
根据你的具体需求,选择合适的方法即可。
我要评论