cmake 使用 *.cpp 规则创建 Makefile

Posted

技术标签:

【中文标题】cmake 使用 *.cpp 规则创建 Makefile【英文标题】:cmake to create Makefile with *.cpp rule 【发布时间】:2016-05-27 14:16:31 【问题描述】:

我刚刚开始使用 cmake,我已经阅读了一些教程并且基本的东西都可以使用。

然而,目前我的 CMakesList.txt 会生成一个 Makefile,其中每个 .cpp 都明确命名。这意味着,每当我向项目中添加新的 .cpp 时,我都需要重新运行 cmake,然后才能制作。虽然这不是什么大不了的事,但还是有点烦人。

既然Makefiles可以做SOURCES=*.cpp之类的事情,我想可能有办法告诉cmake用这样的规则生成Makefile!?

我知道我能做到

cmake_minimum_required(VERSION 2.8)
file(GLOB SRC
    "*.h"
    "*.cpp"
)
add_executable(main $SRC)

但是我仍然需要重新运行 cmake。

【问题讨论】:

为什么要将*.h s´添加到来源? 因为任何 IDE 以这种方式生成的项目文件也会有标题。 对不起,我只是从一些***线程复制粘贴的。我想我应该将带有头文件的文件夹添加为 include_dir,你是对的。 看到一个严重的 Cmake 用法,很可能你可以复制粘贴多个(zlib 许可证)github.com/Darelbi/Bade3D/blob/develop/CMakeLists.txt Best way to specify sourcefiles in CMake的可能重复 【参考方案1】:

据我所知,这样做的方法就像你所说的那样,缺点是每次添加文件时都必须运行 cmake。

为了克服这个问题,我通常会做一个自定义目标来调用 cmake。是这样的

ADD_CUSTOM_TARGET(update
    COMMAND $CMAKE_COMMAND $CMAKE_SOURCE_DIR
    COMMAND $CMAKE_COMMAND --build $CMAKE_BINARY_DIR --target all
    COMMENT "Cmake and build"
)

有了这个你可以调用make update,它会首先调用cmake来捕获所有文件,然后开始构建过程。

【讨论】:

谢谢,有点解决方法,但仍然是一个不错的解决方案! 不客气。这是我自己能想到的最好的用法。这实际上是相当不错的。例如,如果你想在调试和发布之间切换,你可以通过添加两个自定义目标来做同样的事情。 不需要添加具体的target,可以使用make rebuild_cache触发cmake调用。【参考方案2】:

只有在更改文件时才必须重新运行 Cmake,因为 CMake 会编译 CMakeLists.txt 一次,然后生成性能更高的缓存中间格式。 (如果你不添加任何新文件,只要运行 make 命令就可以了)。

请注意,CMake 不能使用 MakeFile 的等效功能,否则它会破坏所有文件依赖项。 CMake 并非旨在仅与 Makefile 一起使用,因此它仅使用目标构建脚本的一部分功能。

此外,如果您已经直接使用 CMake,则不再需要生成 makefile、使用 CMake,并且仅当您需要将项目发送给具有 Makefile 但没有 CMake 的客户时才需要生成 makefile。

【讨论】:

好的,所以我想做的事情是不可能的,对吧?不过我有点困惑,我认为 cmake 会生成 Makefile,然后我仍然必须使用该文件进行构建。你是说我可以直接用cmake来构建项目? 您可以生成 Makefile,但 make 文件不会自动保持更新,如果有重要更改(Cmake 脚本更改或文件被添加到 GLOB),您需要重新生成 makefile。 .当然“项目”生成是为了兼容,你可以直接使用Cmake与--build指令 好的,谢谢。然后我可以让 SublimeText 使用 cmake --build 而不是 mingw32-make,我猜!

以上是关于cmake 使用 *.cpp 规则创建 Makefile的主要内容,如果未能解决你的问题,请参考以下文章

我的Android进阶之旅NDK开发之CMake自定义搜索规则,减少每次都需要配置.cpp和.h的工作量

使用CMake构建复杂工程

yaml-cpp 未定义的 CMake 引用

如何使用 CMake 安装脚本?

链接 Yaml-cpp 和 Armadillo 共享库的 CMake 项目

cmake 生成汇编文件然后编译成可执行文件