MacOS - comment lier une bibliothèque dynamique avec un chemin relatif en utilisant gcc / ld
Si vous êtes à essayer de comprendre la liaison dynamique, cette question est susceptible de les intéresser.
L'une des réponses à cette question fournit un merveilleux exemple de la création et l'utilisation d'une bibliothèque dynamique. Basé sur lui, j'ai certains fichiers simples:
principal.c:
extern void someFunction (int x);
int main (int argc, char** argv ) {
someFunction(666);
}
mylibrary.c:
#include <stdio.h>
void someFunction (int x) {
printf ("\nsomeFunction called with x=%d\n", x);
}
makefile:
main: mylibrary.c main.c
gcc -c mylibrary.c
gcc -dynamiclib -current_version 1.0 mylibrary.o -o libmylibrary.dylib
gcc -c main.c
gcc -v main.o ./libmylibrary.dylib -o main
clean:
rm *.o
rm main
rm *.dylib
Jusqu'à présent, tout fonctionne très bien. Si je le fais, et puis sur enter ./principal à l'invite de commande, je vois le résultat attendu:
someFunction called with x=666
Maintenant, je veux mélanger les choses un petit. J'ai créé un répertoire hidelib, qui est un sous-répertoire de mon répertoire principal. Et je suis à ajouter une ligne à mon makefile:
main: mylibrary.c main.c
gcc -c mylibrary.c
gcc -dynamiclib -current_version 1.0 mylibrary.o -o libmylibrary.dylib
gcc -c main.c
mv libmylibrary.dylib hidelib # this is the new line
clean:
rm *.o
rm main
rm hidelib/*.*
Maintenant, je veux ajouter une autre ligne pour le makefile donc il va trouver libmylibrary.dylib dans le hidelib sous-répertoire. Je veux être en mesure d'exécuter ./principal de la même manière. Comment puis-je le faire?
EDIT: Merci pour la réponse. Avoir beaucoup d'options, c'est merveilleux, mais un débutant veut juste une option concrète qui fonctionne. Voici ce que je suis en train de la dernière ligne, mais clairement je ne comprends pas quelque chose. Le makefile s'exécute sans erreur, mais à l'exécution, il dit "bibliothèque introuvable".
gcc main.o -rpath,'$$ORIGIN/hidelib' -lmylibrary -o main
source d'informationauteur William Jockusch
Vous devez vous connecter pour publier un commentaire.
Une option concrète qui fonctionne consisterait à définir la
install_name
drapeau lors de la liaison de la.dylib
.Alors vous pouvez simplement le lien vers la bibliothèque normalement:
Vous avez probablement besoin de la
-L
compilateur/linker drapeau qui ajoute au chemin de recherche pour les bibliothèques.Tentent de faire bouger les choses après la liaison, vous aurez besoin d'un
dyld
variable d'environnement pour la zone de recherche.man dyld
et vous devriez être en mesure d'obtenir plus d'informations surDYLD_LIBRARY_PATH
et d'autres variables d'environnement.En général, cependant, vous définissez l'installation nom de la bibliothèque avant de les lier à quelque chose avec le
-install_name
éditeur de lien de drapeau à quelque chose comme@rpath/mylibrary.dylib
comme la valeur, puis définissez le terme chemins de recherche sur l'exécutable principal lors de la compilation avec la-rpath
drapeau à@executable_path/hidelib
.Pour plus d'informations, voir
install_name_tool
et la-rpath
&-install_name
arguments deld
.Fondamentalement, il ya beaucoup d'options pour ce que vous essayez de faire.