【问题标题】:cmake to create Makefile with *.cpp rulecmake 使用 *.cpp 规则创建 Makefile
【发布时间】: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 以这种方式生成的项目文件也会有标题。
  • 对不起,我只是从一些stackoverflow线程复制粘贴的。我想我应该将带有头文件的文件夹添加为 include_dir,你是对的。
  • 看到一个严重的 Cmake 用法,很可能你可以复制粘贴多个(zlib 许可证)github.com/Darelbi/Bade3D/blob/develop/CMakeLists.txt

标签: c++ makefile 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,我猜!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-11
  • 2010-09-29
  • 1970-01-01
  • 1970-01-01
  • 2011-04-22
  • 2011-01-01
  • 1970-01-01
相关资源
最近更新 更多