Maison  >  Article  >  développement back-end  >  Comment spécifier les chemins dylib relatifs dans cgo sur macOS

Comment spécifier les chemins dylib relatifs dans cgo sur macOS

WBOY
WBOYavant
2024-02-08 22:10:27708parcourir

如何在 macOS 上的 cgo 中指定相对 dylib 路径

Utiliser cgo sur macOS et spécifier des chemins dylib relatifs est un problème courant. cgo est un outil utilisé par le langage Go pour interagir avec le langage C, tandis que dylib est une bibliothèque de liens dynamiques sur macOS. La spécification de chemins relatifs rend votre projet plus flexible et portable. Alors, comment devrions-nous spécifier les chemins dylib relatifs dans cgo sur macOS ? L'éditeur PHP Strawberry vous répondra en détail.

Contenu de la question

J'essaie actuellement de faire fonctionner un dylib existant écrit en c en go. Pour cela j'utilise cgo et tout se compile correctement. Lorsque go build essaie d'exécuter l'exécutable généré dyld , il ne trouve pas dylib situé dans le répertoire source go.

J'utilise ces cflags et ldflags sans succès :

// #cgo cflags: -i${srcdir}
// #cgo ldflags: -l. -lmylibrary

J'ai également appris que je peux utiliser la chaîne magique @executable_path pour spécifier un chemin de recherche de bibliothèque relatif, mais l'ajouter à -l ou essayer d'ajouter -install_name aux indicateurs de l'éditeur de liens ne donne aucun résultat.

Voici le message d'erreur de l'éditeur de liens que j'ai reçu :

/Users/benedikt/sdk/go1.19.7/bin/go build -o /private/var/folders/.../T/GoLand/___1go_build_myapp myapp #gosetup
/private/var/folders/.../T/GoLand/___1go_build_myapp
dyld[58935]: Library not loaded: '/usr/local/lib/libMyLibrary.dylib'
  Referenced from: '/private/var/folders/.../T/GoLand/___1go_build_myapp'
  Reason: tried: '/usr/local/lib/libMyLibrary.dylib' (no such file), '/usr/lib/libMyLibrary.dylib' (no such file)

Sans ajouter d'étapes de build en dehors de go, comment configurer correctement cgo pour utiliser le dylib situé dans le même dossier où le binaire sera plus tard afin qu'il puisse s'exécuter avec go build ?

Solution de contournement

Il s'avère que j'étais très proche de mon objectif, mais le chemin de recherche stocké dans la bibliothèque actuelle était erroné.

Le code de ma question fonctionne bien après avoir modifié la bibliothèque comme suit :

install_name_tool -id @loader_path/libMyLibrary.dylib libMyLibrary.dylib

Bien que je n'aie pas trouvé de moyen propre de laisser Goland contrôler la construction go pour copier mes bibliothèques dans le répertoire de sortie de l'application en cours d'exécution, j'ai provisoirement copié les dépendances dans la sortie en définissant le répertoire de sortie sur un chemin absolu et en ajoutant Pre -commandes d'exécution pour les dossiers.

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer