如何使用CMake收集源文件而不使用globbing?

pmr*_*pmr 25 build cmake

CMake的文件明确指出,file(GLOB ...)不建议收集源文件的生成,但它没有提什么建议的方法实际上是.

手动指定每个源文件听起来对我来说太过手动了.那么,收集源文件的正确方法是什么,如果没有 file(GLOB ...)

Pet*_*ter 20

手动确实是推荐的方法.通过建议不使用GLOB,文档只是警告依赖于存在的文件的构建系统.例如,您要添加测试可执行文件,因此您创建了mytest.cpp.哎呀.现在您的库编译中断了.AUX_SOURCE_DIRECTORY的文档(与源文件的globbing类似)给出以下警告:

使用此命令避免编写库或可执行目标的源文件列表很有诱惑力.虽然这似乎有效,但CMake无法生成一个知道何时添加新源文件的构建系统.通常,生成的构建系统知道何时需要重新运行CMake,因为CMakeLists.txt文件被修改为添加新源.当源只是添加到目录而不修改此文件时,必须手动重新运行CMake以生成包含新文件的构建系统.

如果您确定要获取目录的所有内容,并且不打算添加新目录,那么一定要使用GLOB.

另外,不要忘记手动列出文件不必涉及键入所有文件名.例如,您可以ls *.cpp >> CMakeLists.txt使用编辑器将文件列表移动到文件中的正确位置.

  • `printf"add_library(xxx $(ls*.cpp))">> CMakeLists.txt`也应该不错! (2认同)

spr*_*aff 15

我正确地使用GLOB,每次添加我运行的文件

touch ../src/CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)

下一个make命令将重新扫描目录.

"CMake没有办法生成一个知道何时添加新源文件的构建系统"真的吗?好的,告诉它吧!

这不是100%自动,但比手动添加文件更容易.


dou*_*uyw 6

我使用cog,一个 python 模块。以下是收集 .cpp 文件的示例:

CMakeLists.txt:

set(SRC_FILES "")

# [[[cog
#    import cog, glob
#    for src in glob.glob('*.cpp'):
#       if "skeleton" in src: continue
#       cog.outl("SET(SRC_FILES ${SRC_FILES} %s)" % src)
# ]]]
# [[[end]]]

add_library(mylib STATIC  ${SRC_FILES})
Run Code Online (Sandbox Code Playgroud)

然后,运行:

python -m cogapp -r CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)

CMakeLists.txt 文件将就地更新。

关于如何安装cog以及其他使用方法,请阅读作者的文章