如何在cmake中添加指定路径源代码文件到SOURCE_FILES


在 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):适用于递归查找指定目录及其子目录中的所有源文件。
函数式递归添加:适用于多个路径下源文件的递归查找。
外部传递路径:适用于灵活传递路径以便动态添加源文件。

根据你的具体需求,选择合适的方法即可。


内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://11000011.com/?id=709

« 上一篇 下一篇 »

我要评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

主机推荐

  • 搬瓦工