2009-12-27 6 views
5

présente mes excuses parce que pour le moment je n'ai pas l'environnement d'expérimenter et de trier les moi-même les questions suivantes:Questions sur linker GCC

1) Disons que j'ai quatre fichiers de bibliothèque: libmylib_super.a et libmylib_super.so, mylib_dumb.a et mylib_dumb.so . Tout en spécifiant les bibliothèques à lier, quelles sont les différences entre les approches suivantes:

A) -l:libmylib_super.a
B) -llibmylib_super
C) -lmylib_super
D) -lmylib_dumb

2) Définition de -static de la page man :

Sur les systèmes qui prennent en charge la liaison dynamique , cela empêche l'association de liens h les bibliothèques partagées. Sur les autres systèmes , cette option n'a aucun effet.

Est-ce que cette option de l'éditeur de liens a quelque chose à voir avec la question 1? Ou ... par hasard vont-ils interférer les uns avec les autres?

Merci.

--- --- édité 2009-12-28

Je viens de recevoir mon environnement et expérimenter un peu, en liant pour stimuler date_time bibliothèque. Dites que j'ai trois fichiers de bibliothèque: libboost_date_time-mt-d.a, libboost_date_time-mt-d.so.1.41.0, libboost_date_time-mt-d.so -> libboost_date_time-mt-d.so.1.41.0 (lien symbolique).

A.1) -l:libboost_date_time-mt-d.a ==> liant OK, fonctionne même sans le fichier de bibliothèque.
A.2) -l:libboost_date_time-mt-d.a avec -static ==>d'erreur reliant/usr/bin/ld: cannot find -lm

C.1) -lboost_date_time-mt-d ==> OK reliant, œuvres binaires mais nécessite le fichier de bibliothèque partagée.
C.2) -lboost_date_time-mt-d avec -static ==>d'erreur reliant/usr/bin/ld: cannot find -lm

Toute idée de l'erreur dans A.2 et C.2?

En outre, lors de l'exécution du programme en C.1, il semble rechercher le fichier de bibliothèque partagée avec le nom libboost_date_time-mt-d.so.1.41.0 mais pas le libboost_date_time-mt-d.so. Ne serait-ce pas gênant si le programme fonctionne sur un système sans la version exacte de la bibliothèque? Quel pourrait être le moyen pratique de gérer la version tout en utilisant la bibliothèque partagée?

Répondre

9

Selon le manuel,

A) recherche le chemin de la bibliothèque pour un fichier exactement nommé libmylib_super.a (la recherche d'abord pour un comportement de bibliothèque partagée ne s'applique pas)

B) recherche le chemin de la bibliothèque un fichier nommé liblibmylib_super.so d'abord, puis liblibmylib_super.a ou seulement des recherches pour un fichier nommé liblibmylib_super.a si -static est utilisé - noter qu'il est l'éditeur de liens qui ajoute le préfixe lib et l'extension du fichier

C) recherche le chemin de la bibliothèque pour une fichier nommé libmylib_super.so d'abord, puis libmylib_super.a ou seulement des recherches pour un fichier nommé liblibmylib_super.so si -static est utilisé

D) voir C)

Notez que B) ne fonctionnera pas parce qu'il est l'éditeur de liens qui devrait ajouter le préfixe lib à le nom de la bibliothèque.

Notez que D) ne fonctionnera pas car votre mylib_dumb ne respecte pas la convention de dénomination.

Voir la GNU Linker Manual:

-l namespec

--library = namespec

Ajoutez le fichier d'archive ou de l'objet spécifié par namespec à la liste des fichiers à lier. Cette option peut être utilisée n'importe quel nombre de fois. Si namespec est de la forme: filename, ld recherchera dans le chemin de la bibliothèque un fichier appelé nom de fichier, sinon il cherchera dans le chemin de la bibliothèque un fichier appelé libnamespec.a.

Sur les systèmes prenant en charge les bibliothèques partagées, ld peut également rechercher des fichiers autres que libnamespec.a. Plus précisément, sur les systèmes ELF et SunOS, ld va chercher dans un répertoire une librairie appelée libnamespec.so avant d'en chercher une appelée libnamespec.a. (Par convention, une extension .so indique une bibliothèque partagée.) Notez que ce comportement ne s'applique pas à: filename, qui spécifie toujours un fichier appelé filename.

L'éditeur de liens ne recherchera une archive qu'une seule fois, à l'emplacement spécifié sur la ligne de commande. Si l'archive définit un symbole qui n'était pas défini dans un objet apparaissant avant l'archive sur la ligne de commande, l'éditeur de liens inclura le (s) fichier (s) approprié (s) de l'archive. Toutefois, un symbole indéfini dans un objet apparaissant plus tard sur la ligne de commande n'entraînera pas l'éditeur de liens à effectuer une nouvelle recherche dans l'archive.

Voir la - (option pour un moyen de forcer l'éditeur de liens aux archives recherche plusieurs fois

Vous peut lister les mêmes archives plusieurs fois sur la ligne de commande

Ce type de recherche archive standard.. Remarque: si vous utilisez ld sous AIX, notez qu'il est différent du comportement de l'éditeur de liens AIX:

+0

Correction: lorsque '-static' est spécifié, seul' .a' sera recherché , pas '.so' – iamamac

+0

oups oui merci –

+0

Vous pouvez trouver m Plus d'informations sur les différentes options sur ce site: http://gcc.gnu.org/onlinedocs/gcc/ –