J'utilise GCC pour compiler un programme que je dois créer un lien vers une bibliothèque C avec un nom non standard; Il s'appelle Je ne peux pas modifier le nom du fichier (problèmes d'autorisation). P>
Je ne veux pas inclure la bibliothèque complète (c'est-à-dire à l'aide de Je veux compiler comme Je travaille sur une boîte Linux. P>
Comment puis-je obtenir la liaison (dynamique) terminée? p>
EDIT: P>
Merci à tous et mes excuses pour une question mal formulée. P>
Je n'ai même pas eu d'objet partagé (je pensais pouvoir relier dynamiquement à un fichier * .a), donc cela s'est confondu beaucoup d'entre vous. Encore une fois, mes excuses pour mon ignorance. P>
Ce que j'ai fini par faire est de créer l'objet partagé dans un annuaire local, ajoute l'emplacement à ma variable d'environnement LD_Library_Path et reliant à nouveau. P>
Cela fonctionne comme un charme (de 1,3 m exécutable jusqu'à 5,8k). p>
Merci encore. P> Stuff.A code> au lieu de
libpstuff.a code>. p>
programme GCC.C Stuff.A -programme Code>) P>
gcc.c -l / chemin / chemin / à / bibliothèque / -lstuff -pramram code> mais GCC ne trouvera pas la bibliothèque (car elle n'est pas appelée
libStuff. un code>). p>
6 Réponses :
pouvez-vous créer un lien symbolique vers Stuff.A code> appelé
libpstuff.a code>? Vous pouvez même faire le lien symbolique dans un autre répertoire (non pas un répertoire de bibliothèque standard) et utiliser l'option
-l code> avec
gcc code> pour inclure le répertoire avec le symbole symbolique. p>
Je pensais faire ça, et c'est peut-être ce que je finis à faire. Je me demandais simplement s'il y a un drapeau spécial que je peux passer à GCC pour le faire savoir que le nom est non standard.
Oui, j'ai testé un lien symbolique fonctionne. Soyez au courant de la variable ld_library_path code>.
En supposant qu'une version d'objet partagée de la bibliothèque statique n'existe pas, il peut être nécessaire de le créer un. N'oubliez pas que la bibliothèque statique Stuff.A est juste une archive ar votre binaire. p> p>
Intéressant, mais les fichiers .O doivent avoir été compilés comme un code indépendant de la position pour que cela fonctionne, ce qu'ils n'auraient peut-être pas été si ils étaient destinés à une bibliothèque statique, non?
C'est la bonne réponse parce que je n'avais même pas d'objet partagé. J'ai fini par en créer un et relie. D'une exécutable de 1,3 m (avec l'approche originale), j'ai transmis à un exécutable de 5,8k. C'est génial. Merci.
+1 pour une utilisation avancée de la boule de cristal ou des capacités de lecture d'esprit;)
Liez-le comme si vous voulez un fichier d'objet: Si vous n'aimez pas le chemin complet, utilisez simplement une variable. sinon vous pouvez analyser ld_library_path et le fichier de test pour une existence là-bas p> p>
Merci inconnu, je ne l'ai pas fait maintenant.
Vous ne pouvez pas créer de lien vers la bibliothèque statique de manière dynamique, il doit être compilé une liaison statique de l'heure. Les objets partagés doivent être compilés avec la photo, les bibliothèques statiques ne sont généralement pas compilées comme celle-ci. Vous devez toujours charger la bibliothèque partagée dans la mémoire au moment de l'exécution, sauf si vous exécutez plusieurs threads, vous ne gagnerez pas beaucoup
Donnez simplement le nom complet:
gcc program.c /path/to/library/stuff.a -oprogram
Vous auriez dû jeter un coup d'oeil sur le manuel de la GCC : < / p>
la seule différence entre utiliser un -l option et spécifier un nom de fichier est que
-l code> entoure la bibliothèque avec 'lib' et ".a" et recherchent plusieurs Répertoires. P> blockQuote>
Il n'y a rien de mal à utiliser
Stuff.A code> comme argument. P>
Il y avait une "dynamique)" dans la question originale, mais je suis de moins en moins sûre que l'OP le signifiait vraiment.
Merci. Je n'étais pas au courant de cela, et avec le vôtre et d'autres commentaires, je suis maintenant capable de résoudre mon problème.
Je sais que le problème s'est avéré être celui qui tente de définir une bibliothèque statique de manière dynamique, mais je souhaitais ajouter ceci à l'intention de la postérité:
Si vous préfèrent votre argument au Dans le cas, vous décrivez où vous souhaitez créer un lien contre un -l Code> Option avec un côlon,
: code>, il traitera le nom comme littéral plutôt qu'un nom qui a besoin du "Lib" ajouté à l'avant et de l'extension de fichier ajoutée à la fin. p>
static.a code> plutôt qu'un
libétatique.a code> et en supposant que vous avez l'intention de lier Contre cela statiquement, les éléments suivants fonctionnent: P>
gcc program.c /path/to/library/stuff.a -oprogram
J'aime cette réponse car il démontre la connexion de -l code> et
-l code> et le tour de colon.
Une version d'objet partagée de la bibliothèque existe-t-elle (Stuff.So)?
J'ai oublié de mentionner, je travaille sur Linux.
@jschmier: Non, seul le
.a code> bibliothèque.