Editor PHP Zimo memperkenalkan: Apabila membangunkan aplikasi iOS, kita selalunya perlu menggunakan perpustakaan statik untuk melanjutkan fungsi atau menyediakan beberapa fungsi alat biasa. Pembangun yang membangun menggunakan bahasa Go mungkin tertanya-tanya cara menggunakan arahan go build untuk membina perpustakaan statik untuk simulator iPhone. Dalam artikel ini, kami akan memperkenalkan secara terperinci cara menggunakan arahan go build untuk membina perpustakaan statik, dan menyediakan beberapa petua dan langkah berjaga-jaga yang praktikal untuk membantu pembangun berjaya menyelesaikan proses pembinaan perpustakaan statik. Sama ada anda seorang pemula atau pembangun yang berpengalaman, anda boleh membaca artikel ini untuk mendapatkan pengetahuan praktikal dan petua tentang membina perpustakaan statik.
Saya menggunakan kaedah berikut untuk membina arkib c dalam projek ios saya:
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 kelihatan seperti ini
#!/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 "$@"
Apabila saya memautkannya dalam xcode dan cuba menjalankannya menggunakan simulator, saya hanya boleh menjalankannya pada peranti itu sendiri:
building for iOS Simulator, but linking in object file built for iOS ... for architecture arm64
Bagaimana untuk meletakkan emulator go build
sebagai perpustakaan statik yang digunakan dalam projek pantas?
Keperluan
tl;dr
Jika anda memilih emulator sebagai destinasi larian, anda boleh melakukan sesuatu yang serupa dengan xcode.
So basically guna -target arm64-apple-ios16.2-simulator
之类的东西而不是 -arch arm64
。还要省略 -mios-version-min=10.0
,因为实际的最小版本是在 -target 中编码的(例如 16.2),它优先(模拟器的正确选项无论如何都是 -miphonesimulator-version-min
) .
Kemudian, sebagai cgo_ldflags
,还指定 -target
选项以及 -syslibroot
dan laluan ke sdk.
Dengan sedikit perubahan pada skrip binaan anda, ia mungkin kelihatan seperti ini:
Ini menentukan emulator sebagai sasaran, dengan versi minimum 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
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
clangwrap.sh
Kemudian clangwrap.sh
dipermudahkan kepada:
#!/bin/zsh clang=$(xcrun --sdk "$sdk" --find clang) exec "$clang" -target "$target" -isysroot "$sdk_path" "$@"
Butiran
Sdk berbeza
Mesti menentukan sdk berbeza untuk peranti ios dan simulator iphone. Anda boleh menemuinya di sebelah platform lain yang disokong oleh xcode
pada platform /applications/xcode.app/contents/developer/platforms
下。例如,在 xcode 14.2 等中,有一个带有 iphoneos16.2.sdk
的 iphoneos
平台和带有 iphonesimulator16.2.sdk
的 iphonesimulator
.
Seorang pekerja epal dalam forum pembangun epal menyiarkan siaran menarik ini: https://developer.apple.com/forums/thread/673387#662260022
Untuk memeriksa perpustakaan statik yang dijana untuk memaparkan arahan load
, anda boleh menghubungi:
otool -l libuplink.a
Pustaka statik yang dijana untuk simulator silikon epal harus memaparkan perkara berikut:
... load command 1 cmd lc_build_version cmdsize 24 platform 7 minos 15.0 sdk 16.2 ...
Nota: platform 7
表示模拟器,minos
表示最低部署目标,sdk
menunjukkan versi sdk sebenar yang digunakan.
Lihat bahagian dalam fail sertakan loader.h
yang berbunyi:
/* 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
Anda boleh melihatnya sendiri pada sistem anda seperti berikut:
cat `xcrun --sdk iphonesimulator --show-sdk-path`/usr/include/mach-o/loader.h
Dibina khusus untuk peranti iphone
Untuk membina perpustakaan statik untuk sdk iphone anda perlu menukar perkara berikut:
export sdk=iphoneos
Dalam skrip build.sh
di atas.
otool -l
akan muncul sebagai:
... Load command 1 cmd LC_BUILD_VERSION cmdsize 24 platform 2 minos 15.0 sdk 16.2 ntools 0 ...
Nota: platform 2
代表 platform_ios
bukan emulator.
Ini sudah tentu berfungsi dengan sempurna pada peranti.
Atas ialah kandungan terperinci Gunakan go build untuk membina perpustakaan statik untuk simulator iPhone. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!