7
votes

Liaison de la bibliothèque C avec un nom non standard

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 Stuff.A au lieu de libpstuff.a .

Je ne peux pas modifier le nom du fichier (problèmes d'autorisation).

Je ne veux pas inclure la bibliothèque complète (c'est-à-dire à l'aide de programme GCC.C Stuff.A -programme )

Je veux compiler comme gcc.c -l / chemin / chemin / à / bibliothèque / -lstuff -pramram mais GCC ne trouvera pas la bibliothèque (car elle n'est pas appelée libStuff. un ).

Je travaille sur une boîte Linux.

Comment puis-je obtenir la liaison (dynamique) terminée?

EDIT:

Merci à tous et mes excuses pour une question mal formulée.

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.

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.

Cela fonctionne comme un charme (de 1,3 m exécutable jusqu'à 5,8k).

Merci encore.


3 commentaires

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 bibliothèque.


6 Réponses :


4
votes

pouvez-vous créer un lien symbolique vers Stuff.A appelé libpstuff.a ? 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 avec gcc pour inclure le répertoire avec le symbole symbolique.


2 commentaires

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 .



7
votes

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.


3 commentaires

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;)



3
votes

Liez-le comme si vous voulez un fichier d'objet: xxx

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


2 commentaires

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



1
votes

Donnez simplement le nom complet:

gcc program.c /path/to/library/stuff.a -oprogram


0 commentaires

9
votes

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 entoure la bibliothèque avec 'lib' et ".a" et recherchent plusieurs Répertoires.

Il n'y a rien de mal à utiliser Stuff.A comme argument.


2 commentaires

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.



5
votes

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 -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>

Dans le cas, vous décrivez où vous souhaitez créer un lien contre un 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


1 commentaires

J'aime cette réponse car il démontre la connexion de -l et -l et le tour de colon.