Как скомпилировать проект 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
@selbie: это работает на действиях GitHub, а версия Xcode — 12.2.
Смотрите мой ответ ниже. Вы, вероятно, хотите -target arm64-apple-macos11
. Обратите внимание, что целевому параметру предшествует одиночный тире, а не двойной тире.
Удалось скомпилировать его для руки?
Нет, в итоге мы арендовали машину MacStadium M1, но все еще нужно скомпилировать это на x84 для руки 🤷♂️
Я нашел подсказку на этой странице, чтобы использовать это:
-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
?
Вы, вероятно, не должны. Clang является компилятором по умолчанию, а командная строка g++
на самом деле просто прокладка, которая перенаправляет к clang.
К сожалению, нам приходится использовать ./configure, так как у нас есть несколько флагов. Есть ли способ сказать ./configure
использовать clang++
?
Я не эксперт по autoconf (это инструмент, который генерирует сценарии настройки). Но вам, вероятно, просто нужно установить скрипт CC=clang
и CXX=clang++
Мы попробовали это безуспешно. Автоинструменты 🤷♂️
Я получаю /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/cdefs.h:807:2: error: Unsupported architecture #error Unsupported architecture
ошибки типа, когда пытаюсь это сделать.
@AlecJacobson - у вас последняя версия XCode? И установили все последние инструменты командной строки?
Да, у меня последняя. Теперь это работает, если я использую clang++ main.cpp -target arm64-apple-macos11 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.1.sdk
Mr. Curious также заинтересовался кросс-компиляцией в M1. Одно неожиданное решение — Zig. Среди прочего, он призван стать лучшим способом кросс-компиляции C; он легко нацеливается на M1 из Linux.
Пару недель назад была серия стримов про кросс-компиляцию в M1: Часть 1 показывает, как использовать Zig в качестве кросс-компилятора в существующих мэйкфайлах, а в Часть 3 успешно демонстрируют компиляцию Redis на Linux для М1.
Настоятельно рекомендуется.
Спасибо, что поделились этим, я займусь Зигом сегодня днем!
В итоге мы решили эту проблему и смогли скомпилировать бинарные файлы 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
У вас установлена последняя версия XCode 12? Вам это понадобится как минимум.