我正在我的iOS项目中使用以下内容构建一个C存档:GOOS=ios GOARCH=arm64 CGO_ENABLED=1 SDK=iphonesimulator CGO_CFLAGS="-fembed-bitcode" CC=
密码/clangwrap.sh go build -buildmode=c-archive -o libuplink.a
Clangwrap.sh 看起来像这样
#!/bin/sh
# go/clangwrap.sh
SDK_PATH=`xcrun --sdk $SDK --show-sdk-path`
CLANG=`xcrun --sdk $SDK --find clang`
if [ "$GOARCH" == "amd64" ]; then
CARCH="x86_64"
elif [ "$GOARCH" == "arm64" ]; then
CARCH="arm64"
fi
exec $CLANG -arch $CARCH -isysroot $SDK_PATH -mios-version-min=10.0 "$@"
但是,当我在XCode中链接它并尝试使用模拟器运行时,我只能在设备本身上运行它:
building for iOS Simulator, but linking in object file built for iOS ... for architecture arm64
如何将Swift项目中使用的静态库的go build
模拟器作为目标?
1条答案
按热度按时间bmvo0sr51#
要求
TL;DR
如果选择模拟器作为运行目标,可以执行类似于Xcode的操作。
所以基本上使用类似
-target arm64-apple-ios16.2-simulator
的东西代替-arch arm64
,也可以省略-mios-version-min=10.0
,因为实际的最小版本是在-target中编码的(例如16.2),它优先(无论如何,模拟器的正确选项应该是-miphonesimulator-version-min
)。然后作为
CGO_LDFLAGS
,还指定-target
选项加上-syslibroot
以及SDK的路径。您的构建脚本做了一些调整,可能如下所示:
这将模拟器指定为目标,最低版本为15。
版本号.sh
目标.sh
** Package 音.sh**
clangwrap.sh
可简化为:详细信息
不同的SDK
必须为iOS设备和iPhone模拟器指定不同的SDK。您可以在
/Applications/Xcode.app/Contents/Developer/Platforms
下Xcode支持的其他平台旁边找到它们。例如,在Xcode 14.2中,iPhoneOS
平台与iPhoneOS16.2.sdk
以及iPhoneSimulator
平台与iPhoneSimulator16.2.sdk
。在苹果开发者论坛上,有一位苹果员工发了这样一个有趣的帖子:https://developer.apple.com/forums/thread/673387#662260022
要检查生成的静态库以显示
load
命令,可以调用:生成的用于Apple Silicon模拟器的静态库应显示如下内容:
注:
platform 7
表示模拟器,minos
表示最低部署目标,sdk
表示实际使用的SDK版本。请参见包含文件
loader.h
中的以下部分:您可以在您的系统上查看它们,如下所示:
为iPhone设备构建
要为iPhone SDK构建静态库,您需要更改以下内容:
在上面的
build.sh
脚本中。如果您尝试在模拟器中使用这个库,它将失败,并显示消息
building for iOS Simulator, but linking in object file built for iOS, file 'libuplink.a' for architecture arm64
。otool -l
的输出为:注:
Platform 2
代表PLATFORM_IOS
,不代表模拟器。这当然会在设备上完美运行。