Gunakan go build untuk membina perpustakaan statik untuk simulator iPhone

PHPz
Lepaskan: 2024-02-09 22:33:08
ke hadapan
960 orang telah melayarinya

使用 go build 为 Iphone 模拟器构建静态库

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.

Kandungan soalan

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 "$@"
Salin selepas log masuk

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
Salin selepas log masuk

Bagaimana untuk meletakkan emulator go build sebagai perpustakaan statik yang digunakan dalam projek pantas?

Penyelesaian

Keperluan

  • Buat perpustakaan statik untuk simulator iphone
  • Gunakan silikon epal dan bukannya emulator intel
  • Keupayaan untuk melaksanakan versi minimum tertentu

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
Salin selepas log masuk

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
Salin selepas log masuk

clangwrap.sh

Kemudian clangwrap.sh dipermudahkan kepada:

#!/bin/zsh

clang=$(xcrun --sdk "$sdk" --find clang)

exec "$clang" -target "$target" -isysroot "$sdk_path" "$@"
Salin selepas log masuk

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.sdkiphoneos 平台和带有 iphonesimulator16.2.sdkiphonesimulator.

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
Salin selepas log masuk

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
...
Salin selepas log masuk

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
Salin selepas log masuk

Anda boleh melihatnya sendiri pada sistem anda seperti berikut:

cat `xcrun --sdk iphonesimulator --show-sdk-path`/usr/include/mach-o/loader.h
Salin selepas log masuk

Dibina khusus untuk peranti iphone

Untuk membina perpustakaan statik untuk sdk iphone anda perlu menukar perkara berikut:

export sdk=iphoneos
Salin selepas log masuk

Dalam skrip build.sh di atas.

Output

otool -l akan muncul sebagai:

...
Load command 1
      cmd LC_BUILD_VERSION
  cmdsize 24
 platform 2
    minos 15.0
      sdk 16.2
   ntools 0
...
Salin selepas log masuk

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!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!