Il existe une bonne question sur la différence entre ces deux options, comme décrit dans Link Binary avec les bibliothèques VS Embed Frameworks .
On dirait que nous avons des options pour les utiliser tous les deux, demandez-vous simplement dans quel cas nous devrions mieux utiliser les fichiers binaires incorporés, ou plutôt un cadre lié?
Des exemples concrets pour résoudre ce problème plus clairement? Merci
La question que vous avez liée fait référence à la fonctionnalité "Lier le binaire avec les bibliothèques", qui est quelque peu différente du binaire incorporé.
"Lier les fichiers binaires avec les bibliothèques" signifie ce que vous attendez en ce qui concerne les liens: Que le fichier binaire soit une bibliothèque statique, une bibliothèque dynamique ou une structure, il sera lié à votre code objet au moment de la création du lien après la compilation.
Lorsque vous songez à un lien avec une bibliothèque statique, ce qui se produit est assez clair: l’éditeur de liens copie le code de la bibliothèque (par exemple, libFoo.a
) dans votre binaire de sortie. La taille de votre fichier de sortie augmente, mais il n'est pas nécessaire de résoudre les dépendances externes au moment de l'exécution. Tout ce que votre programme doit exécuter (en ce qui concerne la bibliothèque statique) est présent après sa construction.
Avec une bibliothèque dynamique (.dylib ou framework fourni par le système), on s'attend à ce que la bibliothèque à laquelle vous liez se trouve soit présente quelque part dans le chemin du chargeur de bibliothèque dynamique du système lorsque vous exécutez votre programme. De cette façon, vous n'avez pas à surcharger la copie de toutes les bibliothèques externes tierces dans votre binaire, et tous les différents programmes sur un ordinateur qui sont également liés à cette bibliothèque pourront la trouver, ce qui économisera au minimum l'espace disque, mais également potentiellement de la mémoire, en fonction de comment et où le système met en cache les bibliothèques.
Un framework ressemble beaucoup à une bibliothèque dynamique, mais peut contenir des ressources dans sa structure de répertoires (images, audio, autres frameworks, etc.). Dans ce cas, une simple bibliothèque statique ou un fichier .dylib ne le coupera pas. Vous devrez peut-être créer un lien vers un framework afin que il puisse trouver ce que vous voulez. il doit fonctionner correctement.
Lorsque vous vous connectez à un framework tiers (par exemple, quelque chose que vous avez téléchargé à partir de github et que vous avez construit vous-même), il se peut qu'il ne soit pas présent sur le système sur lequel vous avez l'intention de fonctionner. Dans ce cas, vous lieriez non seulement le cadre, mais l'intégreriez également dans votre offre en utilisant la phase "Copier les cadres". Lorsque votre programme est exécuté, l'éditeur de liens à l'exécution (ou le résolveur) examinera votre bundle en plus du chemin du chargeur système, recherchera la structure intégrée et le liera afin que votre application dispose du code nécessaire à son exécution.
Enfin, un "fichier binaire incorporé" est un exécutable que vous intégrez tous les deux dans votre lot d’applications via une phase de copie de fichiers et que vous exécutez vous-même, éventuellement avec un appel à popen()
ou similaire. Le binaire incorporé peut être appelé par votre programme, mais il n’est pas lié à celui-ci. C'est une entité entièrement externe (comme les programmes du répertoire /bin
).
En pratique, pour les bibliothèques et les frameworks fournis par le système, vous lierez ces éléments et c’est tout ce que vous avez à faire.
Si vous devez lier une bibliothèque que vous avez construite et ne nécessitant aucune ressource incorporée (c’est-à-dire qu’il n’exige pas de structure), vous pouvez simplement créer un lien avec une bibliothèque statique. Si vous avez plusieurs modules dans votre programme qui souhaitent utiliser le même code de bibliothèque, le convertir en structure ou en bibliothèque dynamique et créer des liens avec ce dernier peuvent économiser de l'espace et s'avérer pratique (en particulier si l'utilisation de la mémoire pose un problème).
Enfin, les frameworks peuvent inclure non seulement des ressources, mais également des fichiers d'en-tête et/ou de licence. Utiliser un framework pour acheminer ces fichiers est en fait un mécanisme de distribution pratique. Vous voudrez peut-être souvent l’intégrer afin que ces éléments puissent être balisés avec votre fichier binaire (c’est-à-dire que les exigences en matière de licence peuvent rendre cela obligatoire).
--- EDIT ---
Adam Johns a posté la question suivante en tant que commentaire:
C'est une excellente réponse. Il y a cependant quelque chose sur lequel je suis un peu confus. Qu'est-ce que cela signifie d'exécuter le binaire vous-même? Voulez-vous dire simplement en utilisant le code du framework embarqué? Je sais que vous avez mentionné popen (), mais vous dites que mon application appelle popen ()? Je ne sais pas vraiment ce que cela signifie.
Je dis qu'un binaire incorporé est simplement un autre fichier de ressources dans votre bundle, comme un fichier audio ou une image, bien que le fichier soit plutôt une commande exécutable. outil en ligne. La fonction popen()
(man popen
De votre terminal pour en savoir plus) vous permet d'exécuter des programmes arbitraires à partir d'un autre programme en cours d'exécution. La fonction system()
est un autre moyen. Il y en a d'autres, et je vais donner un exemple historique ici qui peut rendre plus clair la compréhension de l'utilisation d'un binaire incorporé:
Comme vous le savez probablement, lorsque vous lancez une application sur Mac OS X, celle-ci est lancée avec un identifiant d'utilisateur actuel. Dans la plupart des installations courantes, il s'agit de l'utilisateur par défaut sur le bureau admin
utilisateur, auquel est attribué l'ID utilisateur 501
.
Sur les systèmes d'exploitation basés sur Unix, seul l'utilisateur root
(ID utilisateur 0
) Dispose d'un accès complet à l'ensemble du système de fichiers. Il arrive parfois qu'un programme d'installation lancé par l'utilisateur du bureau ait besoin d'installer des fichiers dans un répertoire privilégié (pilotes par exemple). Dans ce cas, le programme d'application doit attribuer ses privilèges à l'utilisateur root
pour pouvoir écrire dans ces répertoires restreints.
Pour faciliter ceci dans les systèmes d’exploitation sous OS X 10.7, Apple fourni dans sa API des services d’autorisation la fonction AuthorizationExecuteWithPrivileges () (c’est maintenant obsolète, mais reste un exemple utile).
AuthorizationExecuteWithPrivileges()
a pris en argument un chemin d'accès à un outil de ligne de commande à exécuter en tant que root
. L'outil en ligne de commande était un script Shell exécutable ou un fichier binaire compilé que vous avez écrit pour exécuter votre logique d'installation. Cet outil a été installé dans votre lot d'applications, comme tout autre fichier de ressources.
Lorsqu'il est appelé, le système d'exploitation affiche une boîte de dialogue d'autorisation demandant le mot de passe de l'utilisateur (vous l'avez déjà vu!) Et, une fois entré, exécute le programme en tant que root
pour le compte de votre application. Ce processus est similaire à l'exécution d'un programme avec popen()
vous-même, bien que popen()
ne contienne pas à lui seul l'avantage de l'élévation des privilèges.
En bref,
- bibliothèques système, reliez-les;
- Bibliothèques tierces, intégrez-les.
pourquoi?
- si vous essayez d'intégrer des bibliothèques système, vous ne les trouverez pas dans la liste déroulante.
- si vous liez des bibliothèques tierces, vous aurez probablement un crash.
Pour une cible app
Static Library
- Link
ilStatic Framework
- Link
ilDynamic Framework
- Embed
il