CMake:包含目录的排序(如何混合基于系统和用户的包含路径?)

2023-11-25

我有一个 CMake 项目,其中包含并链接两个库,例如A and B(实际上它不止两个,其中之一是增强的东西,但这在这里并不重要)。两者都位于通过FindSomething.cmake(正确)填充标准 CMake 变量的脚本,例如通过添加包含目录

INCLUDE_DIRECTORIES(${A_INCLUDE_DIRS})
INCLUDE_DIRECTORIES(${B_INCLUDE_DIRS})

链接稍后通过

TARGET_LINK_LIBRARIES(mytarget ${A_LIBRARIES} ${B_LIBRARIES})

现在的问题是,这两个库都可以驻留在基于用户的位置或系统目录中(顺便说一下,我在 Linux 上,CMake 2.8.2) - 或同时驻留在两者中。比方说A仅在$HOME/usr/include and $HOME/usr/lib while B(在我的情况下提升)驻留在两个系统路径中(/usr/include and /usr/lib)并且在基于用户的路径中 - 在不同的版本中。可以使用查找脚本来查找系统或基于用户的库B,这有效。

当我想要链接时,麻烦就开始了B从系统路径。${B_INCLUDE_DIRS} and ${B_LIBRARIES}正确指向标头和库的系统范围位置。但还是有${A_INCLUDE_DIRS}指向非系统包含目录,最终也指向库的标头B是从这个位置获取的,而链接B使用系统路径中的版本(通过${B_LIBRARIES})这会导致冲突,即链接错误。

改变顺序INCLUDE_DIRECTORIES声明似乎并没有改变任何事情。我通过以下方式检查了导致链接错误的符号的来源nm --line-numbers在目标文件上。

我能做些什么?有没有什么窍门

  • 强制包含目录的顺序(即使这意味着优先考虑系统路径,尽管还指定了基于用户的位置)?
  • 告诉 CMake 使用${A_INCLUDE_DIRS}对于来自的所有标头A and ${B_INCLUDE_DIRS}对于来自的所有标头B?

这是 CMake 所说的include_directories():

include_directories([之后|之前] [系统] dir1 [dir2 ...])

您可以指定在您告诉系统包含目录时要在系统包含目录之前或之后搜索包含目录。

您还可以指定一个目标:

target_include_directories(目标 [系统] [之前] [items1...] [ [items2...] ...])

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

CMake:包含目录的排序(如何混合基于系统和用户的包含路径?) 的相关文章

随机推荐

  • API 分享计数 Facebook Graph 已弃用?

    从今天起 当我尝试获取份额数时 答案是 v2 9 及更高版本不推荐使用 share 字段 前与 Without 字段 分享显示json内容但是没有股票价值 我需要从 URL 获取 Facebook 的分享计数 API 确实发生了变化 应该是
  • 在 Ruby 中,“new”和“initialize”之间的关系是什么?初始化时如何返回nil?

    我想要的是 obj Foo new 0 gt nil or false 这不起作用 class Foo def initialize val return nil if val 0 end end 我知道在 C C Java C 中 我们不
  • 将 C 与 Android ndk 一起使用

    我正在尝试开发一个 Android 项目 该项目可以从 Java 代码到本机 C 代码进行简单的调用 我参考此链接作为我的指导 http mobile tutsplus com tutorials android ndk tutorial
  • numpy 中是否有 arange/linspace 的多维版本?

    我想要一个 2d NumPy 数组 x y 的列表 其中每个 x 位于 5 4 5 4 3 5 3 5 4 4 5 5 中 y 也相同 我可以 x np arange 5 5 1 0 5 y np arange 5 5 1 0 5 然后迭代
  • 为什么我们必须在react-native中的promise链的末尾调用`.done()`?

    In the 反应本机教程它说 请注意 我们在承诺链的末尾调用 done 始终使 一定要调用done 否则抛出的任何错误都会被吞掉 fetchData function fetch REQUEST URL then response gt
  • 在Java流中,peek真的只能用于调试吗?

    我正在阅读有关 Java 流的内容 并在阅读过程中发现新的东西 我发现的新事物之一是peek 功能 我在 peek 上读到的几乎所有内容都说它应该用于调试您的 Streams 如果我有一个流 其中每个帐户都有一个用户名 密码字段以及一个登录
  • 如何应用新的 Emacs C 样式来重新格式化所有源文件?

    我想使用 emacs 的 Google 格式化功能重新格式化所有源文件 google c style el see here 如何立即将此功能应用于我的所有源文件 以便它们都按照 Google 风格正确格式化和缩进 这有几个部分 您需要想出
  • 如何制作一个在 Windows 中无法被杀死的程序?

    我们正在制作一个供公司内部使用的 Jabber 客户端 我们需要以某种方式捕获用户试图终止程序的时刻 以实际重新启动它 或者只是让用户无法终止客户端 这可能吗 我们的 Jabber 客户端将用 C 编写 我将如何实现这一目标 你所要求的意义
  • Java 中私有静态嵌套类内的访问修饰符

    我在 Java 中有一个 私有静态 嵌套类 此类中的字段和方法的访问修饰符有何意义 我已经尝试过公共和私人 对我的申请没有影响 public class MyList
  • 删除域后的尾部斜杠

    这是我的 htaccess file
  • LINQ 的通配符搜索

    我想知道是否可以使用 LINQ 进行通配符搜索 我看到 LINQ 有 Contains StartsWith EndsWith 等 如果我想要 Test if it work 之类的东西怎么办 Regards 您可以使用SqlMethods
  • 在服务器上部署一段时间后无法连接数据库

    我将我的战争文件上传到我的服务器上 它在部署后完美运行 但一段时间后它显示异常 我正在使用 struts2 和 hibernate my hibernate cfg xml is
  • GLFW 3 已初始化,但还没有?

    我正在努力使用 GLFW 3 函数 glfwCreateWindow 创建窗口 我设置了一个错误回调函数 它几乎只是打印出错误号和描述 并且根据 GLFW 库尚未初始化 即使 glfwInit 函数刚刚返回成功 这是我的代码的摘录 Erro
  • ImageView 上的边框半径和阴影

    我想在 JavaFX 中应用边框半径和阴影 在 CSS3 中它将是 box shadow rgba 0 0 0 0 8 0 0 10px border radius 3px 现在我想在 JavaFX 中实现这一点 但即使是 border r
  • 必须使用mockbean而不是自动装配

    我用的是弹簧靴2 我创建了一个基本测试 RunWith SpringJUnit4ClassRunner class public class VehicleServiceImplTest private VehiculeServiceImp
  • 了解 ARKit 中的坐标空间

    我已阅读所有有关的 Apple 指南ARKit 并观看了一个全球开发者大会视频 但我不明白坐标系如何绑定到 一个真实的世界 A device 3D 场景 相互连接 我可以添加一个对象 例如SCNPlane let stripe SCNPla
  • VBA 中的公共对象模块是什么?

    我试图在 VBA 中尽可能接近函数指针 抽象类 我有一堂课叫VerificationManager并验证几个电子表格中的一堆单元格是否匹配 根据所使用的信息和电子表格 这将以不同的方式完成 我希望能够通过使用以下命令在字符串中指定要调用的方
  • 如何从 YouTube 获取频道 ID?

    我正在尝试使用以下方法从我的频道检索数据YouTube 数据 API V3 为此 我需要我的频道 ID 我尝试从我的 YouTube 帐户中找到我的频道 ID 但各种方法都失败了 如果有人给我一个建议 我会非常高兴 这是我用来检索数据的 U
  • $是什么? Powershell 中的别名?

    今天向我展示的脚本中有这样一行 If do some stuff 我从来没有见过美元符号问号别名 之前我无法通过谷歌确定它的用途 当我在 powershell 窗口中执行它时 它通常返回 True 但偶尔返回 False 我的测试似乎表明
  • CMake:包含目录的排序(如何混合基于系统和用户的包含路径?)

    我有一个 CMake 项目 其中包含并链接两个库 例如A and B 实际上它不止两个 其中之一是增强的东西 但这在这里并不重要 两者都位于通过FindSomething cmake 正确 填充标准 CMake 变量的脚本 例如通过添加包含