Clang 10 无法在 macOS 10.12 上使用 CMake link C++ 应用程序

Clang 10 fails to link C++ application with CMake on macOS 10.12

我有一个 Jenkins 构建服务器 运行 macOS 10.12。

我正在使用最新的 Clang 10(不是 AppleClang)和 CMake 3.17 编译 C++ 应用程序。

我得到的错误是:

The C++ compiler

"/Users/XXX/llvm/bin/clang++"

is not able to compile a simple test program.

It fails with the following output:

ld: unknown option: -platform_version
clang-10: error: linker failed with exit code 1

这适用于同一台服务器上的 Clang 9,Clang 10 适用于 macOS 10.15,所有其他构建工具和源文件都相同(Jenkins 每次都运行干净的构建)。它似乎是 Clang 10 和 macOS 10.12 的组合。 Clang 9 和 Clang 10 之间有什么变化会导致这种情况吗?

我正在这样调用 CMake:

cmake -DCMAKE_OSX_SYSROOT="${macos_sdk}" \
      -DCMAKE_C_COMPILER="${llvm_bin}/clang" \
      -DCMAKE_CXX_COMPILER="${llvm_bin}/clang++" \
      -DCMAKE_OSX_ARCHITECTURES=${architectures} \
      -DCMAKE_BUILD_TYPE=${make_build_type} ..

通过 -mlinker-version=305 将链接器版本传递给 Clang 解决了问题。

对于 CMake,可以这样做:

-DCMAKE_CXX_FLAGS="-mlinker-version=305"

不禁觉得这是一个错误。

链接器版本可以通过 ld -v 在出现问题的 macOS 10.12 上获取。

一个方便的 bash 函数来获取 ld 版本以传递给 Clang:

#!/bin/bash

function get_ld_version() {
  local info=$( ld -v 2>&1 > /dev/null )

  echo "${info}" | perl -wne '/.ld64-(.*?)[^0-9]/ and print "\n"'
}

以防万一有人将 CMAKE 与 CLion IDE 一起使用,它同时测试 C 和 C++ 编译器,添加 -DCMAKE_CXX_FLAGS="-mlinker-version=405" 是不够的,您还需要添加 "-DCMAKE_C_FLAGS="-mlinker-version=405",当然正如@keith 提到的那样,您应该使用自己的链接器版本