Соберите двоичный файл Apple Silicon на машине Intel

Как скомпилировать проект C на macOS 11 (Intel) для работы с Silicon?

Мой текущий скрипт сборки так же прост, как:

./configure
make
sudo make install

Я безуспешно пытался использовать флаги --host и --target с aarch64-apple-darwin и arm-apple-darwin.

Двоичный файл всегда по умолчанию имеет значение x86_64:

> file foobar.so
foobar.so: Mach-O 64-bit bundle x86_64

ОБНОВЛЯТЬ: Кажется, что cc и gcc не найдены, когда указано --host.

checking for arm-apple-darwin-cc... no
checking for arm-apple-darwin-gcc... no

У вас установлена ​​последняя версия XCode 12? Вам это понадобится как минимум.

selbie 21.12.2020 00:38

@selbie: это работает на действиях GitHub, а версия Xcode — 12.2.

Till 21.12.2020 02:57

Смотрите мой ответ ниже. Вы, вероятно, хотите -target arm64-apple-macos11 . Обратите внимание, что целевому параметру предшествует одиночный тире, а не двойной тире.

selbie 21.12.2020 03:48

Удалось скомпилировать его для руки?

Desert Rose 01.03.2021 22:30

Нет, в итоге мы арендовали машину MacStadium M1, но все еще нужно скомпилировать это на x84 для руки 🤷‍♂️

Till 03.03.2021 17:48
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
25
5
9 016
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я нашел подсказку на этой странице, чтобы использовать это:

-target arm64-apple-macos11

Когда я запускаю это со своего Mac:

clang++ main.cpp -target arm64-apple-macos11

Полученный двоичный файл a.out выглядит следующим образом:

% file a.out
a.out: Mach-O 64-bit executable arm64

У меня установлен XCode 12.2.

Передо мной нет Arm Mac, поэтому я предполагаю, что это работает.

Как указать clang++ в качестве компилятора при использовании ./configure?

Till 21.12.2020 03:49

Вы, вероятно, не должны. Clang является компилятором по умолчанию, а командная строка g++ на самом деле просто прокладка, которая перенаправляет к clang.

selbie 21.12.2020 03:53

К сожалению, нам приходится использовать ./configure, так как у нас есть несколько флагов. Есть ли способ сказать ./configure использовать clang++?

Till 27.12.2020 20:31

Я не эксперт по autoconf (это инструмент, который генерирует сценарии настройки). Но вам, вероятно, просто нужно установить скрипт CC=clang и CXX=clang++

selbie 28.12.2020 03:13

Мы попробовали это безуспешно. Автоинструменты 🤷‍♂️

Till 26.03.2021 17:03

Я получаю /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/incl‌​ude/sys/cdefs.h:807:‌​2: error: Unsupported architecture #error Unsupported architecture ошибки типа, когда пытаюсь это сделать.

Alec Jacobson 29.05.2021 19:52

@AlecJacobson - у вас последняя версия XCode? И установили все последние инструменты командной строки?

selbie 29.05.2021 19:53

Да, у меня последняя. Теперь это работает, если я использую clang++ main.cpp -target arm64-apple-macos11 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.‌​platform/Developer/S‌​DKs/MacOSX11.1.sdk

Alec Jacobson 31.05.2021 22:53

Mr. Curious также заинтересовался кросс-компиляцией в M1. Одно неожиданное решение — Zig. Среди прочего, он призван стать лучшим способом кросс-компиляции C; он легко нацеливается на M1 из Linux.

Пару недель назад была серия стримов про кросс-компиляцию в M1: Часть 1 показывает, как использовать Zig в качестве кросс-компилятора в существующих мэйкфайлах, а в Часть 3 успешно демонстрируют компиляцию Redis на Linux для М1.

Настоятельно рекомендуется.

Спасибо, что поделились этим, я займусь Зигом сегодня днем!

Till 26.03.2021 17:04
Ответ принят как подходящий

В итоге мы решили эту проблему и смогли скомпилировать бинарные файлы darwin-arm64 и debian-aarch64 на машинах GitHub Actions x86-64.

Мы предварительно скомпилировали все наши зависимости для arm64 и связали их как статически, так и динамически.

export RELAY_DEPS_PATH=./build-deps/arm64
export PKG_CONFIG_PATH=./build-deps/arm64/lib/pkgconfig

cd ./relay-deps
TARGET=./build-deps make install

cd ./relay
phpize
./configure CFLAGS='-target arm64-apple-macos' \
  --host=aarch64-apple-darwin \
  --enable-relay-jemalloc-prefix
  [snip...]

make

# Dynamically linked binary
cc --target=arm64-apple-darwin \
  ${wl}-flat_namespace ${wl}-undefined ${wl}suppress \
  -o .libs/relay.so -bundle .libs/*.o \
  -L$RELAY_DEPS_PATH/lib -lhiredis -ljemalloc_pic [snip...]

# re-link to standard paths
./relay-deps/utils/macos/relink.sh .libs/relay.so /usr/local/lib
cp .libs/relay.so modules/relay.so

# Build a statically linked shared object
cc --target=arm64-apple-darwin \
  ${wl}-flat_namespace ${wl}-undefined ${wl}suppress \
  -o .libs/relay-static.so -bundle .libs/*.o \
  $RELAY_DEPS_PATH/lib/libhiredis.a \
  $RELAY_DEPS_PATH/lib/libjemalloc_pic.a \
  [snip...]

relink.sh:

#!/bin/bash
set -e

printUsage() {
    echo "$0 <shared-object> <prefix>"
    exit 1
}

if [[ ! -f "$1" || -z "$2" ]]; then
    printUsage
    exit 1
fi

INFILE=$1
PREFIX=$2

links=(libjemalloc libhiredis [snip...])

if [ -z "$PREFIX" ]; then
    PREFIX=libs
fi

for link in ${links[@]}; do
    FROM=$(otool -L "$INFILE"|grep $link|awk '{print $1}')
    FILE=$(basename -- "$FROM")
    TO = "$PREFIX/$FILE"

    echo "$FROM -> $TO"
    install_name_tool -change "$FROM" "$TO" "$1"
done

Другие вопросы по теме