Clang 10 не может связать приложение C ++ с CMake на macOS 10.12 - PullRequest
3 голосов
/ 30 марта 2020

У меня есть сервер сборки Jenkins под управлением macOS 10.12.

Я компилирую приложение C ++, используя последнюю версию Clang 10 (не AppleClang) с CMake 3.17.

Я получаю ошибку:

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} ..

Ответы [ 2 ]

2 голосов
/ 01 мая 2020

На всякий случай, если кто-то использует CMAKE с CLion IDE, которая тестирует компиляторы C и C ++, добавление -DCMAKE_CXX_FLAGS="-mlinker-version=405" недостаточно, вам также нужно добавить "-DCMAKE_C_FLAGS="-mlinker-version=405", конечно, как и то, что @keith упомянул, что вы должны использовать Ваша собственная версия компоновщика

2 голосов
/ 31 марта 2020

Передача версии компоновщика в Clang через -mlinker-version=305 решает проблему.

Для 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"'
}
...