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

Why RPATH_CHECK in CMake deletes executable?

如果 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

Why RPATH_CHECK in CMake deletes executable?

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

Is it correct behavior of CMake, or it is a bug?

正确。

What RPATH_CHECK should do?

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

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