【问题标题】:CMake warnings under OS X: MACOSX_RPATH is not specified for the following targetsOS X 下的 CMake 警告:未为以下目标指定 MACOSX_RPATH
【发布时间】:2015-10-12 05:18:04
【问题描述】:

我尝试在 OS X (Yosemite) 下构建一个基于 CMake 的软件,它可以在 Fedora 21 下成功构建。它使用了一堆库。两者都有,像 Boost 这样的大型开放程序和一些位于 /installation_folder/lib 中的自行编写的程序。我使用 CMake 版本 3.3.0。

执行后

mkdir build
cd build
cmake .. -DCMAKE_C_COMPILER=/usr/local/Cellar/gcc/5.2.0/bin/gcc-5 -DCMAKE_CXX_COMPILER=/usr/local/Cellar/gcc/5.2.0/bin/g++-5  -DCMAKE_MODULE_PATH=${PWD}/../external/install/share/llvm/cmake 

我收到以下警告:

CMake Warning (dev):
Policy CMP0042 is not set: MACOSX_RPATH is enabled by default.  Run "cmake
--help-policy CMP0042" for policy details.  Use the cmake_policy command to
set the policy and suppress this warning.

MACOSX_RPATH is not specified for the following targets:

ClangWrapper
Structure
WCETXML

This warning is for project developers.  Use -Wno-dev to suppress it.

CMakeLists.txt 包含以下有关 RPATH 的行:

SET(CMAKE_SKIP_BUILD_RPATH FALSE)
SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)

LIST(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/lib" isSystemDir)

IF("${isSystemDir}" STREQUAL "-1")
  SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
ENDIF("${isSystemDir}" STREQUAL "-1")

我只能说${CMAKE_INSTALL_PREFIX}/lib 确实是正确的路径,并且正确地找到了像Boost 这样的其他库。

忽略警告并在构建目录中继续使用“make”会导致链接错误。

我阅读了CMake Wiki RPATH handling article,但我仍然无法区分这些路径变量及其在 OS X 上的正确使用。

【问题讨论】:

  • 我们的 CMakeLists.txt 是在仅在 Linux 上开发时创建的。也许另一个选项会导致警告。我不确定。
  • 不要使用 RPATH 的。它们将导致生成的二进制文件无法通过安全审核。相反,请使用 -install_nameinstall_name_tool

标签: macos build makefile cmake shared-libraries


【解决方案1】:

set(CMAKE_MACOSX_RPATH 1) 添加到CMakeLists.txt 中,在上述书面语句之前,让警告消失。执行make 后的链接问题仍然存在。这让我假设我的 RPATH 设置与我的链接问题无关。

不过,这个帖子的问题已经解决了。关于在 CMakeLists.txt 中正确使用 RPATH 选项的解释仍然非常受欢迎!

【讨论】:

  • 你解决过链接问题吗?我也遇到了同样的问题
  • 是的,我解决了。上面提到的 RPATH 变量与链接问题无关。有必要在 CMakeLists.txt 中添加更多库,CMake 可以在 Linux 下自动找到这些库,但在 OS X 下不能。更新:明确禁用(!)RPATH,就像提到的 hopia 一样,也可以解决问题。我得试试看。
  • 或者你可以设置cmake_minimum_required (VERSION 3.0)
【解决方案2】:

好吧,我会从@fotinsky 的回答向前迈出一步。 (请随意将其纳入您的答案中。)

运行 cmake-policy --help-policy CMP0042 的警告建议的输出是:

CMake 2.8.12 and newer has support for using ``@rpath`` in a target's install
name.  This was enabled by setting the target property
``MACOSX_RPATH``.  The ``@rpath`` in an install name is a more
flexible and powerful mechanism than ``@executable_path`` or ``@loader_path``
for locating shared libraries.

CMake 3.0 and later prefer this property to be ON by default.  Projects
wanting ``@rpath`` in a target's install name may remove any setting of
the ``INSTALL_NAME_DIR`` and ``CMAKE_INSTALL_NAME_DIR``
variables.

This policy was introduced in CMake version 3.0.  CMake version
3.1.3 warns when the policy is not set and uses OLD behavior.  Use
the cmake_policy command to set it to OLD or NEW explicitly.

这只是意味着在以后的 cmake 版本中,用户需要显式启用或禁用 CMAKE_MACOSX_RPATH

CMake blog entry 中还有更多关于这个变量引入的背景信息。

【讨论】:

  • 非常有趣。我们的 CMakeLists.txt 中确实使用了 CMAKE_INSTALL_NAME_DIR。通过不设置 RPATH 或启用 RPATH,可能会忽略 INSTALL_NAME 变量。我将尝试显式禁用 RPATH。
【解决方案3】:

正如a comment above中提到的,如果你不需要针对老版本的cmake,你可以简单地设置:

cmake_minimum_required (VERSION 3.0)

这消除了主要版本之间默认值的歧义,并默认启用runtime path behaviors

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 2021-04-17
    • 1970-01-01
    • 2015-10-22
    • 2015-05-10
    • 1970-01-01
    相关资源
    最近更新 更多