首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如果头文件被更改然后恢复,如何停止/欺骗cmake使其不重建?

在CMake中,如果头文件被更改然后恢复,可以通过以下方法停止或欺骗CMake使其不重建:

  1. 使用预编译头文件(Precompiled Header):预编译头文件是一种预先编译的头文件,其中包含了常用的库和头文件的编译结果。通过使用预编译头文件,可以减少编译时间并避免不必要的重建。可以在CMakeLists.txt文件中使用target_precompile_headers命令来指定预编译头文件。
  2. 使用依赖文件(Dependency Files):可以在CMakeLists.txt文件中使用add_dependencies命令来指定依赖文件。通过指定依赖文件,可以告诉CMake在编译过程中检查依赖文件的时间戳,如果依赖文件没有更改,则不会重新编译相关的源文件。
  3. 使用外部构建目录(External Build Directory):可以将CMake的构建目录与源代码目录分离,这样在源代码目录中的更改不会影响构建目录中的编译结果。可以通过以下步骤实现外部构建目录:
    • 在源代码目录外创建一个新的目录,作为构建目录。
    • 进入构建目录,并执行cmake <path_to_source>命令来生成构建系统。
    • 在构建目录中进行编译和构建操作。
  4. 使用CMake缓存(CMake Cache):CMake会将生成的配置信息保存在CMake缓存中,包括头文件路径、库路径等。如果头文件被更改然后恢复,可以手动修改CMake缓存中的相关配置,将其恢复为原始状态,这样CMake就不会重新编译。

需要注意的是,以上方法都是通过一些技巧来停止或欺骗CMake使其不重建,具体的实现方式可能会因项目的具体情况而有所不同。在实际应用中,可以根据项目的需求选择适合的方法来避免不必要的重建。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

CMake库打包以及支持find_package

本文对CMake中库的打包,安装,导出以及支持find_package,使其能够很简单的应用到其他的项目中进行详细的总结。...库的相关配置在config.hpp.in中被定义,然后这个文件会被CMake预处理为config_impl.hpp,然后config.hpp包含到项目中去(#include "config_impl.hpp...这个CMake文件同样能够生成config_impl.hpp,并保存在当前定义的库生成的二进制目录中(${CMAKE_CURRENT_BINARY_DIR}),然后包含在config.hpp中,最终在库使用能够找到...而且这个目录是不能随意更改的,否则在构建的时候会出现问题。......)现在,用户只需要在自己的CMake项目中调用find_package(my_library REQUIRED),这个库就会被自动搜索和找到(如果该库的${CMAKE_BUILD_TYPE}类型已经安装了

43100

面向 C++ 的现代 CMake 教程(二)

然后可以将这些信息传递给编译后的二进制文件,以便它们可以完美地调整(我们将在下一章学习如何做到这一点)。看看 CMake 中 native 提供了哪些信息。...如果工具链不支持所有必需的功能,CMake 将提前停止并显示发生了什么清晰的消息,要求用户介入。...如果你处于这样的情况,源目标在其实现中(.cpp文件)不使用属性,只在头文件中使用,并且这些传递给消费者目标,那么INTERFACE就是答案。 这个机制是如何工作的呢?...使用 CMake,你不需要担心这么多,尤其是如果你正确地组织你的项目(具有相对较小的目标,专注于狭窄的领域)。每个目标都有一个单独的预编译头文件,限制了头文件更改的扩散。...* 另一方面,如果你的头文件认为相当稳定,你可能会决定从一个小目标中重复使用预编译的头文件到另一个目标中。

56500
  • 面向 C++ 的现代 CMake 教程(四)

    然而,如果需要,您可以直接包含导出文件。那么,我们如何定义可以其他项目消耗的包呢?让我们找出答案!...我们在第七章中学习了如何使用它,使用 CMake 管理依赖项。 如果您决定向消耗项目暴露任何宏或函数,建议您将它们的定义放在一个单独的文件中,然后您可以从包的配置文件中include()它。...如果我们这样做,将使用project()命令中提供的版本(如果您的项目没有指定,请期待一个错误)。...首先,我们学习了如何从项目中导出 CMake 目标,以便它们可以在不安装它们的情况下其他项目消费。然后,我们学习了如何安装已经为此目的配置好的项目。...首先,我们学习了如何从项目中导出 CMake 目标,以便它们可以在不安装它们的情况下其他项目消费。然后,我们学习了如何安装已经为此目的配置好的项目。

    59400

    cmake 简介2021-10-03

    :首先cmake生成makefile,然后make edit_cache编辑编译选项;Linux下会打开一个文本框,可以更改,该完后再make生成目标文件——emacs不支持make edit_cache...:首先cmake生成makefile,然后make edit_cache编辑编译选项;Linux下会打开一个文本框,可以更改,该完后再make生成目标文件——emacs不支持make edit_cache...第13-19行是条件判断语句,表示如果 LIBDB_CXX_INCLUDE_DIR 和 LIBDB_CXX_LIBRARIES 都已经赋值,则设置编译时到 LIBDB_CXX_INCLUDE_DIR...这些特性在 gcc/g++ 中是通过编译时的参数来决定的,如果将优化程度调到最高需要设置参数-O3,最低是 -O0 即不做优化;添加调试信息的参数是 -g -ggdb ,如果添加这个参数,调试信息就不会被包含在生成的二进制文件中...这些特性在 gcc/g++ 中是通过编译时的参数来决定的,如果将优化程度调到最高需要设置参数-O3,最低是 -O0 即不做优化;添加调试信息的参数是 -g -ggdb ,如果添加这个参数,调试信息就不会被包含在生成的二进制文件中

    35320

    万字总结编译利器CMake,从入门到项目实战演练

    当然大多数平台都是有这些函数的,只是本教程假设这两个函数没有那么普遍地支持。如果平台有log,那么在mysqrt中,就用它来计算平方根。...然后我们添加了一个自定义命令来详细描述如何通过运行MakeTable来产生Table.h。接下来,我们需要让CMake知道mysqrt.cxx依赖于生成的文件Table.h。...首先,如果需要,在tutorial.cxx中包含MathFunctions.h头文件: #ifdef USE_MYMATH # 包含“MathFunctions.h” #endif 然后,在同一文件中...如果我们将两者倒置会怎样?运行cmakecmake-gui以配置项目,然后使用所选的构建工具进行构建。然后运行构建的Tutorial可执行文件。...存档将被解压到: /home/ehome/Documents/programming/C/power/Demo8 如果您想停止解压,请按 。

    1.2K00

    面向 C++ 的现代 CMake 教程(三)

    CMake 文档警告说,一些修补程序可能比其他修补程序“更粘”。例如,在 Git 中,更改的文件在更新期间不会恢复到原始状态,我们需要小心避免错误地再次修补文件。...如果库不提供安装阶段(或者二进制版本的名字匹配),链接器将抛出错误。 在此之际,我们应该更深入地探讨每个阶段的配置,并解释如何使用不同的下载方法。...检查(区分大小写)是否已经为具有此名称的依赖项进行了填充,以避免重复下载。如果是,就在这里停止。 调用FetchContent_Populate()。...然后,我们报告结果并删除测试对象。让我们试一试。...在我们最初运行测试后,我们留下了许多gcda文件,在任何时候都没有移除。如果我们对源代码做一些更改并重新编译对象文件,将创建新的gcno文件。

    54700

    【C++】开源:数据序列化库protobuf配置与使用

    你可以定义数据的结构,然后使用特殊生成的源代码轻松的在各种数据流中使用各种语言进行编写和读取结构数据。你甚至可以更新数据结构,而破坏由旧数据结构编译的已部署程序。...你可以更新数据结构,而不影响和破坏原有的旧程序 其中,序列化是指将结构数据或对象转换成能够存储和传输(例如网络传输)的格式,同时应当要保证这个序列化结果在之后(可能在另一个计算环境中)能够重建回原来的结构数据或对象...(${CMAKE_CURRENT_BINARY_DIR}) #添加头文件 include_directories(/usr/local/include) link_directories(/usr...但是经常这么使用,代表这么做就是合理。实际将 JSON、XML 直接作用数据序列化通常并不是最优选择,因为它们在速度、效率、空间上并不是最优。换句话说它们更适合数据结构化而非数据序列化。...但是如果从数据序列化的角度你会发现 ProtoBuf 有着明显的优势,效率、速度、空间几乎全面占优,看完后面的 ProtoBuf 编码的文章,你更会了解 ProtoBuf 是如何极尽所能的压榨每一寸空间和性能

    56310

    CMake 秘籍(四)

    如果我们需要验证很多数,我们希望为每一个数都运行埃拉托色尼筛法算法。相反,我们希望一次性列出所有质数,直到某个上限,并使用查表法来验证大量数字。...头文件将作为example的依赖项生成,并且每当generate.py脚本更改时都会重新构建。如果代码生成脚本生成多个源文件,重要的是所有生成的文件都被列为某个目标的依赖项。...生成的头文件随后可以在代码中的正确位置和时间包含,以便将代码版本打印到输出文件或屏幕上。...然而,之前方法的一个不满意之处是,如果我们更改分支或提交更改后配置代码,源代码中包含的版本记录可能会指向错误的 Git 哈希。...然后我们检查{CMAKE_CURRENT_LIST_FILE}是否是included_modules列表的元素。如果是,我们发出警告。

    24920

    解决CMAKE_CURRENT_SOURCE_DIR

    cmakeCopy codeinclude_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)然而,在多级子目录的情况下,如果在 ​​main.cpp​​...示例代码下面是一个示例的 ​​CMakeLists.txt​​ 文件,演示了如何使用 ​​CMAKE_CURRENT_LIST_DIR​​ 变量来解决 ​​CMAKE_CURRENT_SOURCE_DIR​​...为什么选择CMakeCMake有以下几个优点,使其成为选择构建工具的一个好选择:简洁和易读:CMake使用基于文本的配置文件来描述项目的构建过程。这些配置文件可读性很高,易于理解和维护。...运行CMake:使用CMake命令行工具或者图形界面工具,指定CMakeLists.txt文件的路径,然后运行CMakeCMake会解析CMakeLists.txt文件,并生成相应的构建脚本。...如果你正在寻找一个跨平台、易读、可扩展的构建工具,CMake是一个值得考虑的选择。

    43930

    Android串口入门

    Android设备一般需要root, 保证设备串口文件如/dev/ttyS0, /dev/ttyUSB0等可读可写, 如果无权限, 则需要切到su执行chmod 666。...如何确定串口文件和波特率?...比ndk make感觉方便很多, 以前c源文件找不到头文件却可编译过的bug都修复了, 追踪源码方便多了。...串口通信协议 硬件方定义通信协议, 有些是回车换行作为分隔符, 分隔符前还有奇偶校验,笔者看到一些android串口的扩展支持设置奇偶位, 数据位和停止位, 有一些疑惑。...串口重连 串口拔插时应用需要支持重连,在遇到InputStream,OutputStream读取返回-1或不可能恢复的问题时, 处理串口的线程应当捕获错误, 优雅关闭当前串口资源,尝试重连,保证串口应用的健壮性

    2.9K10

    面向 C++ 的现代 CMake 教程(一)

    它教会您如何CMake 项目中使用 CMake,并展示使其可维护、优雅和干净的原因。它引导您通过许多项目中出现的复杂任务的自动化,包括构建、测试和打包。...EXTERNAL部分中的缓存条目是为了让用户修改,而INTERNAL部分由 CMake 管理。请注意,建议您手动更改它们。...同时,这里有一些有趣的细节要注意: 配置文件(原名)包含有关如何使用库二进制文件、头文件和辅助工具的信息。有时,它们暴露出 CMake 宏,可以在您的项目中使用。...然而,要小心分号(;),因为在 CMake 中,这视为分隔符。CMake 会将包含它的参数拆分为多个参数。如果你需要使用它,用反斜杠(\;)转义它。这就是 CMake 如何管理列表的方式。...foo中的第一条命令向CMAKE_MESSAGE_CONTEXT中添加了一个新项,该项带有foo函数名称。打印消息,函数作用域结束,丢弃本地复制的变量,并恢复之前的范围(包含foo)。

    1.2K01

    学习了CC++,居然不了解Cmake这一利器

    CMake 是一个跨平台的自动化建构系统,可以用简单的命令来控制软件编译过程。下面是一个关于如何使用 CMake 进行项目配置和编译的教程。...FATAL_ERROR: 该参数在 cmake 的_2.6_及以后的版本忽略,在 cmake 的_2.4_及以前的版本,需要指明该参数,使得 cmake 能提示失败而不是一个警告。...如果 CMake 运行的版本低于要求的版本,它将停止处理 project 并报告错误。...major(主版本号) minor(次版本号) patch(补丁版本号) tweak LANGUAGES:可选,如果未配置,默认使用 C 以及 CXX 并且CMake会将对应的值分别赋值给对应的变量(如果没有设置...,PRIVATE 表示这些头文件目录仅用于编译 my_target,而传递给链接 my_target 的其他目标。

    14210

    数据库升级-成为MySQL DBA 博客系列(之二)

    您需要通过升级slave,在执行升级所需的时间内将其停止运行(如果一切顺利,超过几分钟的停机时间,即仅需很短的时间)。...在某些情况下,甚至不需要任何更改,因为代理可以自行适应拓扑更改,并检测哪个节点可用,哪个不可用。顺便说一句,这就是你应该确定如何配置你的代理。 一旦每个从机都被更新,您需要执行一个计划的故障切换。...Galera升级 使用Galera,执行升级要容易一些—您需要逐个停止节点,升级停止的节点,然后重新启动,然后再转到下一个节点。...如果您的代理需要一些手动调整来确保流量不会受到正在进行维护的节点的攻击,则必须进行这些更改如果它可以自动检测所有的东西,你只需要停止MySQL,升级并重新启动。...这个过程比为每个从站执行转储/重新加载要快得多—每个复制群集执行一次就可以了,然后使用物理备份来重建其他从站。如果您使用AWS,则可以依靠EBS快照而不是xtrabackup。

    1.4K30

    cmake基础示例:如何编译【跨平台】的动态库和应用程序

    在很久之前,曾经在B站上传过几个小视频,介绍了在Windows和Linux这两个平台下,如何通过cmake和make这两个构建工具,来编译、链接动态库、静态库以及可执行程序。...当这个动态库应用程序(myapp)使用的时候,myapp.c在 include mylib.h 的时,关闭宏 MYLIB_EXPORT,此时下面这个宏就生效: #define MYLIB_API _...Linux 下构建过程 cmake 配置 为了污染源文件目录,在最外层目录下新建build目录,然后执行cmake指令: $ cd ~/tmp/cmake_demo/ $ mkdir build $...打开 VSCode,然后打开测试代码文件夹 cmake_demo: 因为需要使用cmake工具来构建,所以需要在VSCode安装 cmake 插件。...(如何安装 VSCode 插件就不赘述了) 第一步: cmake 配置 按下键盘 ctrl + shift + p,在命令窗口中选择 Cmake: Configure,如果没看到这个选项,就手动输入前面的几个字符

    3K20

    安卓activity生命周期_请描述activity的生命周期

    此方法通常用于确认对持久性数据的未保存更改停止动画以及其他可能消耗 CPU 的内容,诸如此类。...而后如果 Activity 恢复与用户的交互,则会调用 onRestart 方法,如果 Activity 销毁,则会调用onDestroy方法。...(Activity系统回收或者当前设备的配置发生了变化“例如横屏”,从而导致Activity销毁重建,我们来看下官网流程图) 先总结一下有什么生命周期回调方法以及各个生命周期回调方法都是代表什么意思...然后如果系统终止您的应用进程,并且用户返回您的 Activity,则系统会重建该 Activity,并将Bundle同时传递给onCreate和onRestoreInstanceState。...Android 框架中几乎每个小部件都会根据需要实现此方法,以便在重建 Activity 时自动保存和恢复对 UI 所做的任何可见更改

    56310

    CMake vs Make对比

    “Make”工具需要知道如何构建程序。它了解如何从名为“makefile”的文件构建程序。这个makefile列出了每个非源文件以及如何从其他文件中计算它。...因此,如果更改了一些源文件,然后运行“Make”,它不会重新编译整个事情。它仅更新直接或间接依赖于您更改的源文件的那些非源文件。很整洁!“Make”不限于任何特定语言。...如果你不是所有的,你可以跳到下一节。处理包含头文件,库等的所有常见的编译器/链接器标记都被平台独立的和构建系统无关的命令所取代。...当然,当第三方库(如OpenGL)以便携式的方式包含时,CMake真的开始闪耀。 有什么不同? 如果您使用Makefile,即在命令行中键入“make”,则构建过程有一个步骤。...CMake不仅仅是“make”,所以它可以更复杂。从长远来看,最好是学习如何使用它。如果只在一个平台上只有一个小项目,那么也许“Make”可以做得更好。

    4K31

    从零开始编写一个cmake构建脚本

    后续可以直接使用这三个内置变量来使用库的版本号配置构建语言可以自己根据工程配置需要构建的语言,比如CXX表示可以编译C++文件;C表示可以编译c文件;ASM表示可以编译汇编文件enable_language(CXX C ASM)配置测试用例可选变量配置自定义变量,默认构建测试用例...message(WARNING "message text") # 构建时打印警告信息message(FATAL_ERROR "message text") # 产生CMAKE Error时,会停止编译构建过程...target_link_libraries(${TARGET_SAMPLE_NAME} PUBLIC ${TARGET_NAME}) #配置所依赖的库endif()文件安装支持install,库对外提供find_package...的能力install后,所有导出的头文件、动态库、静态库、可执行二进制、cmake文件都可以安装到指定路径下install(TARGETS ${TARGET_NAME} #TARGETS 安装的目标文件...}/@TARGET_NAME@Targets.cmake)check_required_components(@TARGET_NAME@) #检查@TARGET_NAME@写在最后如果你觉得这篇内容对你还蛮有帮助

    12520

    CMake基础

    之后就可以在外面使用 子目录的 CMakeLists.txt 里路径名(比如 hello.cpp)都是相对路径,这也是很方便的一点 5.子模块头文件的处理 因为 hello.h 移到了 hellolib...子文件夹里,因此 main.cpp 里也要改成: 如果要避免修改代码,我们可以通过 target_include_directories 指定a.out 的头文件搜索目录:(其中第一个 hellolib...表示当前路径,因为子目录里的路径是相对路径,类似还有 … 表示上一层目录 此外,如果希望让引用 hellolib 的可执行文件自动添加这个路径,把 PUBLIC 改成 PRIVATE 即可,这就是他们的用途...只需要把他们的 include 目录或头文件下载下来,然后 include_directories(spdlog/include) 即可 缺点:函数直接实现在头文件里,没有提前编译,从而需要重复编译同样内容.../TBB/TBBConfig.cmake)能够自动查找所有依赖,并利用刚刚提到的 PUBLIC PRIVATE 正确处理依赖项,比如如果你引用了 OpenVDB::openvdb 那么 TBB::tbb

    1.9K20
    领券