【问题标题】:Why RPATH_CHECK in CMake deletes executable?为什么 CMake 中的 RPATH_CHECK 会删除可执行文件?
【发布时间】:2021-12-21 03:50:40
【问题描述】:

如果 RPATH 不同,以下 CMake 的操作将删除可执行文件。

file(RPATH_CHECK
    FILE "${CMAKE_CURRENT_SOURCE_DIR}/moc"
    RPATH "\$ORIGIN/../lib")

如果 RPATH 不是 $ORIGIN/../lib,则 - 操作,并且不再有可执行文件。

这是 CMake 的正确行为,还是一个错误?

RPATH_CHECK 应该做什么?

我在 Linux 上的 Qt 6.2.1 中发现了这个问题。 Qt 构建成功,但 cmake --install . 失败,因为 CMake 删除了可执行文件,原因是 RPATH_CHECK 文件的操作与 RPATH 不匹配(声明的和实际的)。实际 RPATH 是 :::::::::::::: 在执行点 RPATH_CHECK

我在 Kubuntu 20.04 上。我使用官方在线安装程序安装了 Qt 的源代码。要配置我使用的 Qt:

./configure -nomake tests -nomake examples -skip qttest -skip qtwebengine -skip qtwebview -skip qtpositioning -skip qtsensors -skip qtserialbus -skip qtserialport -skip qtnfc -skip qtcharts -skip qt3d -skip qtwayland -skip qtcoap -skip qtdatavis3d -skip qtlottie -skip qtmqtt -skip qtnetworkauth -skip qtopcua -skip qtquick3d -skip qtquicktimeline -skip qtremoteobjects -skip qtvirtualkeyboard -skip qtwebchannel -skip qtwebsockets -release -shared -skip qt5compat -skip qtdoc -skip qtscxml -skip qttranslations -skip qttools

然后

cmake --build . --parallel

CMake 版本 3.16.3

【问题讨论】:

  • 我找不到您最近关于非常相似的问题的问题,您似乎已将其删除。请注意,当您找到有关问题帖子中描述的问题的更多信息时,在 Stack Overflow 首选方法是编辑问题帖子,而不是删除现有问题帖子并创建一个新的。
  • RPATH_CHECK内部 CMake 功能。它没有在文档中描述,并且不打算在任何代码中使用,除了由 CMake 自己生成的代码。询问内部功能可以做什么有点道理:只有 CMake 开发人员可以回答,而且他们不太可能希望回答,因为他们不会在外部代码中使用内部功能。相反,请询问您的 CMake 项目的具体问题。据我记得,您之前的问题更多是关于具体项目的。
  • @Tsyvarev 当然,但是这个问题非常空间,有很多错觉,没有人评论或回答,所以我决定创建一个明确的问题。很抱歉给您带来不便。
  • @Tsyvarev 我知道RPATH_CHECK 是内部功能,但 CMake 会生成自己的安装脚本,并失败。我调查了RPATH不匹配的问题,并试图了解这个问题:CMake的或Qt的项目。
  • “只是想了解这个问题:CMake 的或 Qt 的项目” - 像往常一样:假设错误出现在您的项目中。除非你能展示项目,每个人都能发现项目是正确的。

标签: cmake qt6


【解决方案1】:

为什么 CMake 中的 RPATH_CHECK 会删除可执行文件?

因为它就是这样做的。 (?)

这是 CMake 的正确行为,还是一个错误?

正确。

RPATH_CHECK 应该做什么?

检查文件是否具有所需的 RPATH,如果没有,则应删除该文件。

如果您对 CMake 中的 RPATH 功能有任何其他疑虑,我在最后一个答案中发布了源代码 - 一切都在那里。在 CMake 源代码树中搜索 RPATH_CHECK,您会找到函数 - 从函数名称中您可以“猜测”含义和使用的算法。

【讨论】:

    猜你喜欢
    • 2016-05-13
    • 2013-02-18
    • 2017-01-26
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多