Maison > développement back-end > Golang > le corps du texte

Utilisez go build pour créer des bibliothèques statiques pour le simulateur iPhone

PHPz
Libérer: 2024-02-09 22:33:08
avant
960 Les gens l'ont consulté

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

Présentation de l'éditeur PHP Zimo : lors du développement d'applications iOS, nous devons souvent utiliser des bibliothèques statiques pour étendre des fonctions ou fournir certaines fonctions d'outils courantes. Les développeurs qui développent à l'aide du langage Go peuvent se demander comment utiliser la commande go build pour créer une bibliothèque statique pour le simulateur iPhone. Dans cet article, nous présenterons en détail comment utiliser la commande go build pour créer une bibliothèque statique, et fournirons quelques conseils et précautions pratiques pour aider les développeurs à mener à bien le processus de création de bibliothèque statique. Que vous soyez débutant ou développeur expérimenté, vous pouvez lire cet article pour acquérir des connaissances pratiques et des conseils sur la création de bibliothèques statiques.

Contenu de la question

J'utilise la méthode suivante pour créer une archive c dans mon projet iOS :

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 ressemble à ceci

#!/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 "$@"
Copier après la connexion

Lorsque je le lie dans Xcode et que j'essaie de l'exécuter à l'aide du simulateur, je ne peux l'exécuter que sur l'appareil lui-même :

building for iOS Simulator, but linking in object file built for iOS ... for architecture arm64
Copier après la connexion

Comment positionner l'émulateur de go build en tant que bibliothèque statique utilisée dans un projet Swift ?

Solution

Exigences

  • Créer une bibliothèque statique pour le simulateur iPhone
  • Utilisez Apple Silicon au lieu de l'émulateur Intel
  • Possibilité d'implémenter des versions minimales spécifiques

tl;dr

Si vous sélectionnez l'émulateur comme destination d'exécution, vous pouvez faire quelque chose de similaire à xcode.

Donc, en gros, utilisez -target arm64-apple-ios16.2-simulator 之类的东西而不是 -arch arm64 。还要省略 -mios-version-min=10.0,因为实际的最小版本是在 -target 中编码的(例如 16.2),它优先(模拟器的正确选项无论如何都是 -miphonesimulator-version-min) .

Ensuite, comme cgo_ldflags,还指定 -target 选项以及 -syslibroot et le chemin vers le SDK.

Avec une légère modification de votre script de build, cela pourrait ressembler à ceci :

Cela spécifie l'émulateur comme cible, avec une version minimale de 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
Copier après la connexion

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
Copier après la connexion

clangwrap.sh

Puis clangwrap.sh se simplifie en :

#!/bin/zsh

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

exec "$clang" -target "$target" -isysroot "$sdk_path" "$@"
Copier après la connexion

Détails

SDK différent

Doit spécifier un SDK différent pour l'appareil iOS et le simulateur iPhone. Vous pouvez les trouver à côté d'autres plateformes supportées par xcode sur la plateforme /applications/xcode.app/contents/developer/platforms 下。例如,在 xcode 14.2 等中,有一个带有 iphoneos16.2.sdkiphoneos 平台和带有 iphonesimulator16.2.sdkiphonesimulator.

Un employé d'Apple sur le forum des développeurs Apple a publié ce message intéressant : https://developer.apple.com/forums/thread/673387#662260022

Pour inspecter la bibliothèque statique générée afin d'afficher la commande load, vous pouvez appeler :

otool -l libuplink.a
Copier après la connexion

La bibliothèque statique générée pour le simulateur Apple Silicon devrait afficher ce qui suit :

...
load command 1
      cmd lc_build_version
  cmdsize 24
 platform 7
    minos 15.0
      sdk 16.2
...
Copier après la connexion

Remarque : platform 7 表示模拟器,minos 表示最低部署目标,sdk indique la version réelle du SDK utilisée.

Voir la section dans le fichier d'inclusion loader.h qui dit :

/* 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
Copier après la connexion

Vous pouvez les visualiser vous-même sur votre système comme suit :

cat `xcrun --sdk iphonesimulator --show-sdk-path`/usr/include/mach-o/loader.h
Copier après la connexion

Construit spécifiquement pour les appareils iPhone

Pour créer une bibliothèque statique pour le SDK iPhone, vous devez modifier les éléments suivants :

export sdk=iphoneos
Copier après la connexion

Dans le script build.sh ci-dessus.

Le résultat de

otool -l apparaîtra comme : 

...
Load command 1
      cmd LC_BUILD_VERSION
  cmdsize 24
 platform 2
    minos 15.0
      sdk 16.2
   ntools 0
...
Copier après la connexion

Remarque : platform 2 代表 platform_ios n'est pas un émulateur.

Cela fonctionne bien sûr parfaitement sur l'appareil.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!