当前位置: 首页 > 知识库问答 >
问题:

在英特尔机器上构建苹果硅二进制文件

宗建章
2023-03-14

如何在macOS 11(英特尔)上编译一个C项目来进行工作硅

我当前的构建脚本很简单:

./configure
make
sudo make install

我已经尝试使用--host--Target标志与aarch64-apple-darwinarm-apple-darwin没有任何运气。

二进制文件始终默认为x86_64

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

更新:当指定了--host时,似乎找不到cc和gcc。

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

共有3个答案

东方弘壮
2023-03-14

我们最终解决了这个问题,并能够在GitHub Actions的x86-64机器上编译darwin-arm64debian-aarch64二进制文件。

我们预先编译了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
公西鸿博
2023-03-14

好奇先生对交叉编译到M1也很好奇。一个意想不到的解决方案是Zig。它的目标是成为交叉编译C的最佳方式;它很容易从Linux瞄准M1。

几周前有一系列关于交叉编译到M1的流:第1部分展示了如何在现有的makefile中使用Zig作为交叉编译器,在第3部分中,他们成功地演示了在Linux上为M1编译Redis。

强烈推荐。

郑燕七
2023-03-14

我在这页上找到了一个提示:

-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。

我的面前没有一个手臂Mac,所以我假设这是可行的。

 类似资料:
  • 新的Xcode 12是否支持为不在新的Apple Silicon上运行的计算机制作应用程序?我想知道这一点,因为我需要为自己制作一个新的应用程序。

  • 在我之前的基于英特尔的Mac电脑上,我曾经包括 在我的shell资源文件中。新的基于ARM的Apple芯片上的正确编译标志是什么?????似乎还没有很多资源,任何指针都非常感谢!

  • 我有一个Flutter项目,我正试图在iOS上运行。它在我的基于英特尔的Mac电脑上正常运行,但在我的新的基于苹果硅的M1 Mac电脑上,它无法安装吊舱。 基于Github解决方案,我尝试使用rosetta运行Terminal,但问题仍然是:https://github.com/CocoaPods/CocoaPods/issues/9907#issuecomment-655870749 意识到现在

  • 我刚刚尝试在Apple Mac Pro上运行Apache Flink的基本示例,新的M1处理器使用Rosetta 2兼容层。 不幸的是,它在以下堆栈跟踪中失败: 所以我的问题是,有人让它运行了吗?有可能在苹果硅上执行Flink工作吗? 编辑(13.04.2021)顺便说一句:使用Rosetta兼容层运行时发生此错误。因此,不幸的是,这并不能解决当前的问题。 编辑(2021年4月14日,回应理查德·

  • 我已经使用这里的安装链接安装了postgres 之后通过自制 然后 我运行时出错了。 是 psql: 错误: 无法连接到服务器: 连接被拒绝 服务器是否在本地运行并接受 Unix 域套接字上的连接 “/tmp/.s.PGSQL.5432”? 和 引导失败:5:输入/输出错误错误:执行时失败以5退出。 找不到任何博客或教程。怎么安装?

  • 所以我已经从他们的网站上下载了正确的苹果硅android studio安装。当试图安装时,安装过程卡在这条消息上: 正在下载https://dl . Google . com/Android/repository/emulator-Darwin _ aarch 64-8807927 . zip警告:此下载无法从临时状态完成。不缓存重试。正在下载https://dl . Google . com/A