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的工作量