php小編子墨介紹:在開(kāi)發(fā)iOS應(yīng)用程序時(shí),我們常常需要使用靜態(tài)庫(kù)來(lái)擴(kuò)展功能或者提供一些通用的工具函數(shù)。使用go語(yǔ)言進(jìn)行開(kāi)發(fā)的開(kāi)發(fā)者可能會(huì)想知道如何使用go build命令來(lái)構(gòu)建適用于iPhone模擬器的靜態(tài)庫(kù)。在本文中,我們將詳細(xì)介紹如何使用go build命令來(lái)構(gòu)建靜態(tài)庫(kù),并且提供一些實(shí)用的技巧和注意事項(xiàng),幫助開(kāi)發(fā)者順利完成靜態(tài)庫(kù)的構(gòu)建過(guò)程。無(wú)論你是初學(xué)者還是有一定經(jīng)驗(yàn)的開(kāi)發(fā)者,都可以通過(guò)閱讀本文來(lái)獲得關(guān)于構(gòu)建靜態(tài)庫(kù)的實(shí)用知識(shí)和技巧。
問(wèn)題內(nèi)容
我使用以下方法在我的 ios 項(xiàng)目中構(gòu)建一個(gè) c 存檔:
goos=ios goarch=arm64 cgo_enabled=1 sdk=iphonesimulator cgo_cflags="-fembed-bitcode" cc=
pwd/clangwrap.sh go build -buildmode=c-archive -o libuplink.a
clangwrap.sh 看起來(lái)像這樣
#!/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 "$@"
登錄后復(fù)制
當(dāng)我在 xcode 中鏈接它并嘗試使用模擬器運(yùn)行時(shí),我只能在設(shè)備本身上運(yùn)行它:
building for iOS Simulator, but linking in object file built for iOS ... for architecture arm64
登錄后復(fù)制
如何將 go build
的模擬器定位為 swift 項(xiàng)目中使用的靜態(tài)庫(kù)?
解決方法
要求
為 iphone 模擬器創(chuàng)建靜態(tài)庫(kù)
使用 apple silicon 而不是 intel 模擬器
能夠?qū)崿F(xiàn)特定的最低版本
tl;dr
如果您選擇模擬器作為運(yùn)行目的地,您可以執(zhí)行類(lèi)似于 xcode 的操作。
所以基本上使用 -target arm64-apple-ios16.2-simulator
之類(lèi)的東西而不是 -arch arm64
。還要省略 -mios-version-min=10.0
,因?yàn)閷?shí)際的最小版本是在 -target 中編碼的(例如 16.2),它優(yōu)先(模擬器的正確選項(xiàng)無(wú)論如何都是 -miphonesimulator-version-min
) .
然后,作為 cgo_ldflags
,還指定 -target
選項(xiàng)以及 -syslibroot
以及 sdk 的路徑。
你的構(gòu)建腳本稍微調(diào)整了一下,它可能看起來(lái)像這樣:
這指定模擬器作為目標(biāo),最低版本為 15。
build.sh
#!/bin/sh export goos=ios export goarch=arm64 export cgo_enabled=1 export sdk=iphonesimulator export cgo_cflags="-fembed-bitcode" export min_version=15 . ./target.sh export cgo_ldflags="-target ${target} -syslibroot \"${sdk_path}\"" cc="$(pwd)/clangwrap.sh" export cc go build -buildmode=c-archive -o libuplink.a
登錄后復(fù)制
target.sh
#!/bin/sh sdk_path=$(xcrun --sdk "$sdk" --show-sdk-path) export sdk_path if [ "$goarch" = "amd64" ]; then carch="x86_64" elif [ "$goarch" = "arm64" ]; then carch="arm64" fi if [ "$sdk" = "iphoneos" ]; then export target="$carch-apple-ios$min_version" elif [ "$sdk" = "iphonesimulator" ]; then export target="$carch-apple-ios$min_version-simulator" fi
登錄后復(fù)制
clangwrap.sh
然后 clangwrap.sh
簡(jiǎn)化為:
#!/bin/zsh clang=$(xcrun --sdk "$sdk" --find clang) exec "$clang" -target "$target" -isysroot "$sdk_path" "$@"
登錄后復(fù)制
詳細(xì)信息
不同的 sdk
必須為 ios 設(shè)備和 iphone 模擬器指定不同的 sdk。您可以在 xcode 支持的其他平臺(tái)旁邊找到它們
在 /applications/xcode.app/contents/developer/platforms
下。例如,在 xcode 14.2 等中,有一個(gè)帶有 iphoneos16.2.sdk
的 iphoneos
平臺(tái)和帶有 iphonesimulator16.2.sdk
的 iphonesimulator
平臺(tái)。
apple 開(kāi)發(fā)者論壇中的一位 apple 員工發(fā)布了這篇有趣的帖子:https: //developer.apple.com/forums/thread/673387#662260022
要檢查生成的靜態(tài)庫(kù)以顯示load
命令,可以調(diào)用:
otool -l libuplink.a
登錄后復(fù)制
生成的用于 apple silicon 模擬器的靜態(tài)庫(kù)應(yīng)顯示如下內(nèi)容:
... load command 1 cmd lc_build_version cmdsize 24 platform 7 minos 15.0 sdk 16.2 ...
登錄后復(fù)制
注意:platform 7
表示模擬器,minos
表示最低部署目標(biāo),sdk
表示實(shí)際使用的 sdk 版本。
請(qǐng)參閱包含文件 loader.h
中的部分,內(nèi)容如下:
/* known values for the above platform field. */ #define platform_unknown 0 #define platform_any 0xffffff #define platform_macos 1 #define platform_ios 2 #define platform_tvos 3 #define platform_watchos 4 #define platform_bridgeos 5 #define platform_maccatalyst 6 #define platform_iossimulator 7 #define platform_tvossimulator 8 #define platform_watchossimulator 9 #define platform_driverkit 10
登錄后復(fù)制
您可以在自己的系統(tǒng)上自行查看它們,如下所示:
cat `xcrun --sdk iphonesimulator --show-sdk-path`/usr/include/mach-o/loader.h
登錄后復(fù)制
專(zhuān)為 iphone 設(shè)備構(gòu)建
要為 iphone sdk 構(gòu)建靜態(tài)庫(kù),您需要更改以下內(nèi)容:
export sdk=iphoneos
登錄后復(fù)制
在上面的 build.sh
腳本中。
otool -l
的輸出將顯示為:
... Load command 1 cmd LC_BUILD_VERSION cmdsize 24 platform 2 minos 15.0 sdk 16.2 ntools 0 ...
登錄后復(fù)制
注意:platform 2
代表 platform_ios
而不是模擬器。
這當(dāng)然可以在設(shè)備上完美運(yùn)行。