如果构建是源代码外的,CMake 无法找出标头依赖项?

2024-04-22

我一直在使用 CMake 来管理一个单独的小型 c++ 项目(基于 Unix Makefile),并决定将其转换为更有组织的源代码外构建。但是,当它超出源时(通过执行cmake ..在 build/) 中,我的标头不再是其源文件的依赖项。如果我只是从顶层进行 cmake,一切都会恢复正常。

所以我做了一个小测试版本,发现了同样的问题。顺便说一句,我使用的是 Arch Linux 系统。最初,我的项目位于 /tmp 目录(有意)并通过阅读这个问题:使用 cmake 处理头文件依赖关系 https://stackoverflow.com/questions/7461000/handling-header-files-dependencies-with-cmake,我认为这可能是罪魁祸首,因为 CMake 可能将目录视为系统目录,因此认为我的标头来自系统库,所以我将其移至我的主文件夹。没有改变。然后我搞乱了 CMakeLists.txt 中的路径,但它似乎没有改变任何东西。我还尝试用绝对路径替换所有内容。

项目/CMakeLists.txt:

cmake_minimum_required (VERSION 2.8)
project (MYTEST)

include_directories(${CMAKE_SOURCE_DIR}/include)

file(GLOB SOURCES "${CMAKE_SOURCE_DIR}/src/*.cpp")
add_executable(app ${SOURCES})

项目/src/hey.cpp:

#include "hey.h"

int main()
{
  std::cout << "Heyyy" << std::endl;
  return 0;
}

项目/include/hey.h:

#include <iostream>

现在,如果我创建一个新目录 project/build 并cmake ..然后从该目录make,项目编译。但是,如果我以任何方式改变 hey.h 并尝试make再次,什么都不会重新编译。 dependent.make文件与此一致:

# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 3.15

CMakeFiles/app.dir/src/hey.cpp.o: ../src/hey.cpp

但如果我cmake .从顶层目录project,一切顺利,依赖项都存在:

# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 3.15

CMakeFiles/app.dir/src/hey.cpp.o: src/hey.cpp
CMakeFiles/app.dir/src/hey.cpp.o: include/hey.h

我发现人们有类似的问题,但大多数都是边缘情况,导致只有一个标头不被包含在内。我的实际项目没有找到任何标头依赖项。 /:我很容易就使用 CMake 犯了严重错误(我对它有点陌生),但我环顾四周,发现每个人的做法似乎都不同。


如果您的构建目录是源目录的子目录,那么它并不是真正的源外目录,而是一种混合目录。推荐的 CMake 方法是执行正确的源外构建,其中源目录和二进制目录完全不相关。这意味着他们可以是兄弟姐妹,也可以是远亲,但都不是对方的后代。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果构建是源代码外的,CMake 无法找出标头依赖项? 的相关文章

  • 浮点等于的意外结果

    问题不在于为什么0 1 0 9不等于1 0 这是关于平等者的不同行为 有人可以解释为什么下面的示例的工作方式不同 float q 0 1f float w 0 9f float summ q w q w 1 0f False summ 1
  • codecvt 不是 std 标头吗?

    此代码使用 Visual C 11 进行编译 并在 Windows 7 上按预期运行 但无法使用 Windows 7 上的 MinGW 4 7 0 或 Linux 上的 gcc 4 8 0 进行编译 编译用 std c 11 flag in
  • 调用事件,h(args) 与 EventName?.Invoke()

    我总是这样调用事件 void onSomeEvent string someArg var h this EventName if h null h this new MyEventArgs someArg 今天 VS 2015 告诉我这可
  • C++:初始化结构体并设置函数指针

    我正在尝试使用函数指针初始化结构 但是除非使用全局函数完成 否则我很难这样做 以下代码有效 float tester float v return 2 0f v struct MyClass Example typedef float My
  • 用于生成 C++ 代码轮廓/图的工具 - 有这样的东西吗? [复制]

    这个问题在这里已经有答案了 我需要深入研究用 C 编写的软件组件并对其进行一些修改 我幻想生成一些代码映射 它将显示类之间的关系并引导我完成方法的流程 调用图 有这个工具吗 几年前 我使用 Rational Rose 建模工具 该工具具有对
  • OpenGL 着色器不与着色器程序链接

    我正在尝试使用 GLFW GLEW 添加着色器 我收到一个错误 指出着色器已加载 但它们没有有效的对象代码 这是我用于加载着色器的代码 class SHADER public void LoadShaders const char vert
  • 如何检查特定作业是否在quartz调度程序中运行#

    我正在使用石英调度程序根据触发器的用户输入来安排写入文件的作业 我想检查作业是否仍在 stop 方法中运行 如何检查作业是否仍在运行 public class JobScheduler static StdSchedulerFactory
  • 更改 RabbitMQ 队列中的参数

    我有一个 RabbitMQ 队列 最初声明如下 var result channel QueueDeclare NewQueue true false false null 我正在尝试添加死信交换 因此我将代码更改为 channel Exc
  • 如何测试抽象类的受保护抽象方法?

    我一直在研究测试名为的抽象类的最佳方法TabsActionFilter 我保证继承自的类TabsActionFilter将有一个名为GetCustomer 在实践中 这种设计似乎效果很好 我遇到的一些问题是弄清楚如何测试OnActionEx
  • Fluent NHibernate 一对一映射

    我很难利用 Fluent NHibernate 的 HasOne 映射 基本上 A 类在 B 类中可以有匹配的 只有一条或没有 记录 请帮助定义关系的 AMap 和 BMap 类 谢谢 public class A public virtu
  • WPF 应用程序在每个系统规模上具有相同的大小(与规模无关)

    有没有办法让 WPF 应用程序在每个系统规模上获得相同的大小 当我改变时更改文本 应用程序和其他项目的大小在windows系统设置中125 推荐 to 100 在全高清屏幕中 我的 WPF 应用程序变得太小 为了实现独立的系统缩放应用程序
  • Web 服务错误“提供的 URI 方案‘http’无效;需要‘https’。”

    我的服务调用导致以下错误 提供的 URI 方案 http 无效 需要 https 应用程序配置值
  • C++ 按值而不是按引用将数组发送到函数

    我的 C 有问题 我有一个对数组进行排序的函数 但我不想处理原始数组 我想通过值而不是通过引用将数组发送到函数 请帮我 int bogoSort int tab int n int iloscOperacjiDominujacych 0 c
  • OpenGL 中连续暂停

    void keyPress unsigned char key int x int y int i switch key case f i 3 while i x pos 3 sleep 100 glutPostRedisplay 上面是在
  • ThemeInfo 属性有什么用?

    每当我创建新的 WPF 应用程序或 WPF 用户控件库时 AssemblyInfo cs文件包含以下属性 assembly ThemeInfo ResourceDictionaryLocation None where theme spec
  • 除了 iptables 之外还有数据包管理实用程序吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个 Linux 实用程序 它可以根据一组规则更改网络数据包的有效负载 理想情况下 我会使用
  • 从 C++ 检索 Python 类型

    这个问题实际上是以下两个问题的延伸 如何在 Python 中实现 C 类 以供 C 调用 https stackoverflow com questions 9040669 how can i implement a c class in
  • C 中的静态和外部内联函数[重复]

    这个问题在这里已经有答案了 我正在尝试详细了解静态函数和外部函数之间的区别 我知道静态内联函数和外部内联函数之间的基本区别 我的理解如有错误请指正 静态内联函数仅对定义它的翻译单元可见 外部内联函数可以在多个翻译单元中访问 最好在头文件中定
  • 检测 Windows 重新启动是否是由于 Windows 更新造成的

    我的电脑上的一些应用程序一直在检测 Windows 更新是否重新启动 这是可以观察到的 因为它们会在 Windows 更新自动重启后重新启动 这非常有帮助 因为这些应用程序会重新加载更改 甚至unsaved更改或恢复选项卡 如果是浏览器 执
  • 在 C# 中调用并排显示窗口

    愚蠢的问题是否有一种简单的方法可以清除桌面 然后打开两个资源管理器窗口并调用 并排显示窗口 任务栏调用 只是想知道 MS 库中是否有 api 可以做到这一点 您可以使用TileWindowsWinAPI 函数通过 p invoke 将所需窗

随机推荐

  • 为什么括号会减慢我的 R 程序速度

    我在朋友的代码中发现了一些多余的括号 这确实减慢了执行时间 如果对此有什么解释的话 请查看这个示例代码 Python 也是一种 quesi 解释语言 不会受到此程序的影响 0 370 seconds x lt 0 while x lt 10
  • 尝试将我的应用程序添加到系统设置 -> 隐私和安全 -> 辅助功能列表是应用程序崩溃的原因

    我有一些应用程序 此应用程序必须具有辅助功能 才能使用全局热键 打开辅助功能首选项窗口没有问题 系统设置 gt 隐私和安全 gt 辅助功能 但用户必须手动单击 按钮 才能在硬盘上搜索我的应用程序并将我的应用程序手动添加到列表中 我正在尝试将
  • 为什么浏览器中的 http auth UI 如此糟糕?

    为什么没有注销按钮 为什么没有 您登录的网站 列表 是因为 HTTP 规范有问题吗 如果 Web 开发人员实际上可以依赖 HTTP 身份验证 那么他们的生活会容易得多 就 HTTP 而言 它是无国籍的 http www webopedia
  • 快速CRC算法?

    我想从 ASCII 字符串创建一个 32 位数字 CRC32 算法正是我正在寻找的 但我无法使用它 因为它需要的表太大了 它适用于资源非常稀有的嵌入式系统 那么 对于快速且精简的 CRC 算法有什么建议吗 当冲突的可能性比原始 CRC32
  • 如何在 SSIS 变量中存储“完全限定”和“仅名称”文件名

    我有一个 SSIS 包 其中有一个 Foreach 循环容器 加载静态文件夹中的所有 txt 文件 我将完全限定的文件名作为在连接字符串中使用的变量传递 我现在只需将文件名传递给一个变量以用于执行存储过程 问题是如果我将 Foreach 循
  • 刷新 Passport.js 中的令牌

    我如何在 Passport js 中执行此操作 当访问令牌过期时 您可以使用refresh token 刷新 您的访问权限 并获得另一个 access token 要使用 fresh token 您需要向我们的令牌端点发出 POST 请求
  • spring jndi NamingException:名称 [spring.liveBeansView.mbeanDomain] 未在此上下文中绑定

    我的 web 应用程序与 spring 3 2 4 运行良好 但是当我启动它时 我会得到调试信息 2014 05 20 11 11 47 DEBUG JndiTemplate 150 Looking up JNDI object with
  • 逐行读取文件而不是逐字读取文件

    我正在尝试编写一些代码来扫描输入文件中的回文 但它从每个单词而不是每行获取字符串 一个例子是赛车会显示为racecar 回文或太热而不能叫 回文 但相反它会显示为too 不是回文 hot 不是回文等等 这是我当前正在执行的读取文件的操作 F
  • 什么整数哈希函数可以接受整数哈希键?

    什么整数哈希函数可以接受整数哈希键 我发现以下算法提供了非常好的统计分布 每个输入位以大约 50 的概率影响每个输出位 不存在冲突 每个输入都会产生不同的输出 除非 CPU 没有内置整数乘法单元 否则该算法速度很快 C 代码 假设int是
  • 启动时出现速度错误“VM全局库.vm”

    我正在将 Velocity 与 Spring 一起使用 但在 Eclipse 控制台中我收到此错误 我的代码工作正常 但我想知道如何修复它 ResourceManager 无法在任何资源加载器中找到资源 VM global library
  • Android:连接和彩色阿拉伯字母

    我想显示已连接ANDandroid 视图 webview 或 textview 上的彩色阿拉伯字母 首先 我使用了没有颜色的 TextView 并且阿拉伯语显示正确 当我使用 spannableString 时 彩色字母与单词断开 其次 我
  • 如何从套接字读取接收自定义数据类型?

    我想接收数据 自定义类型 例如 CMYType 我有以下代码 using namespace boost asio streambuf receivedStreamBuffer streambuf mutable buffers type
  • Conda 将一个环境.yml 导入另一个环境

    考虑将具有依赖项的 Python 子模块导入到具有其自己的依赖项的项目中的情况 假设子模块有它的environment yml文件和项目本身有一个environment yml file 有没有办法创建一个包含这两种环境规范的环境 如果是的
  • 为什么 std::sort 将元素与其自身进行比较

    正如题主所说 为什么下面的代码将某些元素与它们自身进行比较 include
  • Django - 在同一网址中有两个视图

    我正在 django 中制作一个网站 在我的主页中我想显示我最近的博客文章列表 下面的几个块我想制作一个简单的联系表单 博客和联系表格分别运行良好 但我想将它们包含在同一页面中 显然在同一网址中 views py 是 from forms
  • AnkhSVN 和 VisualSVN 可以同时使用吗?

    我想尝试 AnkhSVN 的一项功能 即与 Red Gate SQL Changeset 工具集成 而无需完全卸载 VisualSVN 这感觉很危险 所以我想看看其他人是否有经验可以减轻或证实我的恐惧 Update所以我尝试卸载 Visua
  • Visual Studio 2012 - 条件编译符号设置的位置

    我一生都找不到要在 Visual Studio 2012 中输入项目的条件编译符号的字段 我是这个功能的新手 所以我不知道它是否已被重命名为其他名称 但是我正在努力追随本指南 http www codeproject com Article
  • AWS Step Functions 等待 CodeBuild 完成

    如何等待 CodeBuild 在 Step Functions 状态机内完成 我现在能想到的唯一等待是使用循环和计时器 就像下面的流程一样 但这是唯一的方法吗 没有 WaitForBuild 操作或类似的操作吗 拼写错误 BatchGetB
  • ASP.NET MVC 是否为区域创建默认路由

    我的 MVC 3 应用程序 身份验证 和 用户 中有几个区域 我在用Phil Haacks 路由调试工具 http haacked com archive 2008 03 13 url routing debugger aspx查看我的路线
  • 如果构建是源代码外的,CMake 无法找出标头依赖项?

    我一直在使用 CMake 来管理一个单独的小型 c 项目 基于 Unix Makefile 并决定将其转换为更有组织的源代码外构建 但是 当它超出源时 通过执行cmake 在 build 中 我的标头不再是其源文件的依赖项 如果我只是从顶层