首页 > 解决方案 > Clang 10 无法在 macOS 10.12 上将 C++ 应用程序与 CMake 链接起来

问题描述

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

我正在使用带有 CMake 3.17 的最新 Clang 10(不是 AppleClang)编译 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} ..

标签: c++macoscmakeclangllvm-clang

解决方案


通过-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 "$1\n"'
}

推荐阅读