【问题标题】:Correct iOS architecture names for autotools?自动工具的正确 iOS 架构名称?
【发布时间】:2020-02-06 14:23:54
【问题描述】:

autotools 的移动平台(即基于 ARM 的)标准架构名称是什么?

我尝试为 iOS 构建一些 C/C++ 库,包括 arm64armv7 和 iOS 模拟器(i386x86_64),但我总是为 arm64 提供相同的二进制文件和x86_64-simulator,这反过来又使lipo 的通用二进制构建失败。我尝试将--build--host 开关设置为以下一对

  • 对于 arm64:--build=x86_64-apple-darwinuname -r, --host=arm64
  • 对于 x86_64-simulator:--build=x86_64-apple-darwinuname -r, --host=x86_64-apple-darwinuname -r

令我惊讶的是,运行以下脚本,

## Environments
ScriptDir="$( cd "$( dirname "$0" )" && pwd )"
cd - &> /dev/null

# Exit the build pass if any command returns a non-zero value
#set -o errexit


# Echo commands
set -x

DARWIN=darwin`uname -r`

MIN_SDK_VERSION=8.0

IPHONEOS_SYSROOT=`xcrun --sdk iphoneos --show-sdk-path`
IPHONESIMULATOR_SYSROOT=`xcrun --sdk iphonesimulator --show-sdk-path`

# Verbose clang output
#CLANG_VERBOSE="--verbose"

CC=/usr/bin/clang
CXX=/usr/bin/clang

SILENCED_WARNINGS="-Wno-unused-local-typedef -Wno-unused-function"
STDLIB=libc++

CFLAGS="${CLANG_VERBOSE} ${SILENCED_WARNINGS} -DNDEBUG -g -O0 -pipe -fPIC -fcxx-exceptions"
CXXFLAGS="${CFLAGS} -std=c++11 -stdlib=${STDLIB}"

LDFLAGS="-stdlib=${STDLIB}"
LIBS="-lc++ -lc++abi"

PROTOC=`which protoc`

SOURCE_DIR="$ScriptDir"

PREFIX="$ScriptDir"/_build
if [ -d ${PREFIX} ]
then
    rm -rf "${PREFIX}"
fi
mkdir -p "${PREFIX}/platform" &> /dev/null

## Functions

build_arch() {
  HOST=$1
  ARCH=$2
  PLATFORM_CFLAGS=$3
  PLATFORM_NAME=${ARCH}
  SYSROOT=${IPHONEOS_SYSROOT}

  ARCH_BITS=x86_64
  if [[ $ARCH==armv7 || $ARCH==armv7s ]]; then
    ARCH_BITS=i386
  fi

  CC="${CC}"
  CFLAGS="${CFLAGS} -miphoneos-version-min=${MIN_SDK_VERSION} -arch ${ARCH} -isysroot ${SYSROOT} ${PLATFORM_CFLAGS}" \
  CXX="${CXX}" \
  CXXFLAGS="${CXXFLAGS} -miphoneos-version-min=${MIN_SDK_VERSION} -arch ${ARCH} -isysroot ${SYSROOT}" \
  LDFLAGS="-arch ${ARCH} -miphoneos-version-min=${MIN_SDK_VERSION} ${LDFLAGS}" \
  LIBS="${LIBS}" \
  ./configure \
    --without-gcc \
    --disable-ld-version-script \
    --build=x86_64-apple-${DARWIN} \
    --host=${HOST} \
    --with-protoc=${PROTOC} \
    --disable-shared \
    --prefix=${PREFIX} \
    --exec-prefix=${PREFIX}/platform/${PLATFORM_NAME}

  make -j8
  make install
}

build_simulator() {
  ARCH=$1
  PLATFORM_CFLAGS=$2
  HOST=${ARCH}-apple-${DARWIN}
  PLATFORM_NAME=${ARCH}-simulator
  SYSROOT=${IPHONESIMULATOR_SYSROOT}

  CC="${CC}" \
  CFLAGS="${CFLAGS} -mios-simulator-version-min=${MIN_SDK_VERSION} -arch ${ARCH} -isysroot ${SYSROOT} ${PLATFORM_CFLAGS}" \
  CXX="${CXX}" \
  CXXFLAGS="${CXXFLAGS} -mios-simulator-version-min=${MIN_SDK_VERSION} -arch ${ARCH} -isysroot ${SYSROOT}" \
  LDFLAGS="-arch ${ARCH} -mios-simulator-version-min=${MIN_SDK_VERSION} ${LDFLAGS}" \
  LIBS="${LIBS}" \
  ./configure \
    --without-gcc \
    --disable-ld-version-script \
    --build=x86_64-apple-${DARWIN} \
    --host=${HOST} \
    --with-protoc=${PROTOC} \
    --disable-shared \
    --prefix=${PREFIX} \
    --exec-prefix=${PREFIX}/platform/${PLATFORM_NAME}

  make -j8
  make install
}


build_fat_lib() {
  OUT=${PREFIX}/universal
  mkdir -p ${OUT}

  PLATFORM_ROOT=${PREFIX}/platform
  LIPO=lipo

  LIB=libprotobuf.a
  ${LIPO} ${PLATFORM_ROOT}/arm64/lib/${LIB} \
          ${PLATFORM_ROOT}/x86_64-simulator/lib/${LIB} \
          -create \
          -output ${OUT}/${LIB}

  LIB_LITE=libprotobuf-lite.a
  ${LIPO} ${PLATFORM_ROOT}/arm64/lib/${LIB_LITE} \
          ${PLATFORM_ROOT}/x86_64-simulator/lib/${LIB_LITE} \
          -create \
          -output ${OUT}/${LIB_LITE}
}

## Build pass

cd ${SOURCE_DIR}

./autogen.sh

build_simulator x86_64 "-fembed-bitcode"

build_arch arm arm64 "-fembed-bitcode"

build_fat_lib

echo DONE!

,我最终收到了来自 lipo 的投诉:

+ lipo /path/to/protobuf/_build/platform/arm64/lib/libprotobuf.a /path/to/protobuf/_build/platform/x86_64-simulator/lib/libprotobuf.a -create -output /path/to/protobuf/_build/universal/libprotobuf.a

fatal error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo: /path/to/protobuf/_build/platform/arm64/lib/libprotobuf.a and /path/to/protobuf/_build/platform/x86_64-simulator/lib/libprotobuf.a have the same architectures (x86_64) and can't be in the same fat output file

我的第一印象是我误用了架构名称,而且我不知道从哪里获得标准名称。是这样吗?

【问题讨论】:

  • 特别注意建议的欺骗目标的第二个答案,它建议在所需主机的示例上运行config.guess 脚本。如果您不能或不想在该机器上安装 Autoconf,那么脚本本身可以从 GNU 的 Git 服务器获得:git.savannah.gnu.org/gitweb/…。请注意,ARM 架构不止一种。
  • 但是,我怀疑您的问题有所不同。由于您要专门指定编译器和架构选择标志,因此请确保它们成功生成交叉二进制文件。

标签: c++ ios compiler-errors autotools


【解决方案1】:

自己解决了。

事实证明,真正的问题不是错误的三元组,而是分配给 CC/CXX 的不合适的编译器可执行文件。你必须使用

SDK="iphoneos"
export CC=$(xcrun --find --sdk "${SDK}" clang)
export CXX=$(xcrun --find --sdk "${SDK}" clang++)
export CPP=$(xcrun --find --sdk "${SDK}" cpp)

问题 #1

@JohnBolinger 建议的config.guess 将始终返回

x86_64-apple-darwin18.7.0

这会导致我之前的 x86_64 构建错误。

问题 #2

观察 Xcode 构建日志,您可能会发现 -target arm64-apple-ios13.1 作为 Clang 选项,不要与自动工具配置选项 --target 混淆。不幸的是,这个也没用。

【讨论】:

  • 以防万一您在这里,因为我正在寻找在新 Mac mini (M1) 上编译 findutils-4.7.0 的答案并得到相同的错误“无效配置arm64-apple-darwin20.2.0': machine arm64-苹果'无法识别";我能够解决这个问题: --build=aarch64-unknown-linux-gnu --host=aarch64-unknown-linux-gnu
猜你喜欢
  • 2011-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-25
相关资源
最近更新 更多