使用CMake自动将文件夹中的所有文件添加到目标?

mar*_*jno 150 c++ cross-platform cmake

我正在考虑将跨平台项目从Visual C++,XCode和makefile中的单独构建管理系统切换到CMake.

我需要的一个基本功能是自动将目录中的所有文件添加到目标.虽然这很容易用make做,但使用Visual C++和XCode并不容易做到(如果我错了,请纠正我).是否可以直接在CMake中进行?怎么样?

在学习CMake之前,请随意添加我应该注意的任何其他事情,考虑到目前该项目是中等规模的(8个库,2个可执行文件,8个测试项目,它取决于大约8个外部库).

Kle*_*ist 210

有可能的.例如file(GLOB:

cmake_minimum_required(VERSION 2.8)

file(GLOB helloworld_SRC
    "*.h"
    "*.cpp"
)

add_executable(helloworld ${helloworld_SRC})
Run Code Online (Sandbox Code Playgroud)

请注意,如果添加或删除源文件,则需要手动重新运行cmake,因为生成的构建系统不知道何时要求CMake重新生成,并且在每次构建时执行此操作都会增加构建时间.

  • 这里建议使用v3.1以后更好的方法:**target_sources()**https://crascit.com/2016/01/31/enhanced-source-file-handling-with-target_sources/ (10认同)
  • 手动重新运行cmake的另一种方法是在运行make之前触摸CMakeLists.txt文件. (9认同)
  • >"我们不建议使用GLOB从源树中收集源文件列表.如果在添加或删除源时没有更改CMakeLists.txt文件,则生成的构建系统无法知道何时要求CMake重新生成." 在Hand1Cloud链接的CMAKE3.7文档中不再推荐使用此功能 (7认同)
  • 什么是GLOB的替代品呢? (4认同)
  • `GLOB` 的替代:[`file(GLOB_RECURSE 变量 [RELATIVE path] [FOLLOW_SYMLINKS] [globbing 表达式]...)`](https://cmake.org/cmake/help/v3.0/command/file. html)。 (2认同)
  • 当尝试用数千个文件移植现有项目时,这绝对是一场噩梦. (2认同)

kar*_*niz 31

克莱斯特的答案肯定有效,但有一个重要的警告:

当你写一个Makefile手动,你可能会产生一个SRCS使用功能选择所有变量.cpp.h文件.如果稍后添加了源文件,则重新运行make将包含它.

但是,CMake(使用类似命令file(GLOB ...))将显式生成文件列表并将其放入自动生成的文件列表中Makefile.如果您有新的源文件,则需要Makefile通过重新运行来重新生成cmake.

编辑:无需删除Makefile.

  • 这不是答案,而是对@ Kleist答案的评论. (16认同)
  • 不能简单地重新运行cmake,这应该删除/修改过时的Makefile? (4认同)
  • @Neowizard不在Stackoverflow术语中. (2认同)
  • 这个评论很好,但它是“标准”,对吗?提问者已经在使用 cmake,所以建议 make 可以“更智能”并没有多大帮助。 (2认同)

Tsy*_*rev 7

扩展@Kleist答案

由于CMake的3.12附加选项CONFIGURE_DEPENDS支持通过命令file(GLOB)file(GLOB_RECURSE)。使用此选项有没有需要手动添加/删除目录中的源文件后重新运行cmake - CMake的将是重新运行在未来建设项目自动。

但是,选项CONFIGURE_DEPENDS意味着每次请求构建时都会重新检查相应的目录,因此构建过程将比没有CONFIGURE_DEPENDS花费更多的时间

即使有CONFIGURE_DEPENDS选项可用,CMake 文档仍然不建议使用file(GLOB)file(GLOB_RECURSE)收集源。

  • @Thomas:他们建议手动列出每个源文件。[那个答案](/sf/answers/1297691111/)对该建议给出了很好的解释。 (2认同)