Réponses:
Faire référence à:
http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.apps/2004-05/0436.html
Vous avez besoin de la version statique de la bibliothèque pour la lier.
Une bibliothèque partagée est en fait un exécutable dans un format spécial avec des points d'entrée spécifiés (et quelques problèmes d'adressage persistants inclus). Il ne dispose pas de toutes les informations nécessaires pour établir un lien statique.
Vous ne pouvez pas lier statiquement une bibliothèque partagée (ou lier dynamiquement une bibliothèque statique).
Le drapeau -static
forcera l'éditeur de liens à utiliser des bibliothèques statiques (.a) au lieu de celles partagées (.so). Mais les bibliothèques statiques ne sont pas toujours installées par défaut, vous devrez donc peut-être installer la bibliothèque statique vous-même.
Une autre approche possible consiste à utiliser un statificateur ou de l' hermine . Les deux outils prennent comme entrée un exécutable lié dynamiquement et comme sortie créent un exécutable autonome avec toutes les bibliothèques partagées incorporées.
Si vous voulez lier, disons, libapplejuice statiquement, mais pas, disons, liborangejuice , vous pouvez créer un lien comme ceci:
gcc object1.o object2.o -Wl,-Bstatic -lapplejuice -Wl,-Bdynamic -lorangejuice -o binary
Il y a une mise en garde - si elle est liborangejuice
utilisée libapplejuice
, elle libapplejuice
sera également liée dynamiquement.
Vous devrez établir un lien liborangejuice
statique avec libapplejuice
pour obtenir de la libapplejuice
statique.
Et n'oubliez pas de garder -Wl,-Bdynamic
sinon vous finirez par lier tout ce qui est statique, y compris libc
(ce qui n'est pas une bonne chose à faire).
gcc -o main main.cc -Wl,-rpath=. -Wl,-Bdynamic -lB -Wl,-Bstatic -lA -Wl,-Bdynamic -L.
libB utilise libA , il est lié et ldd
n'affiche pas de référence à libA . L'exécutable fonctionne bien. Testé avec g ++ 4.7.3.
Si vous avez le fichier .a de votre bibliothèque partagée (.so), vous pouvez simplement l'inclure avec son chemin complet comme s'il s'agissait d'un fichier objet, comme ceci:
Cela génère main.o en compilant simplement:
gcc -c main.c
Cela relie ce fichier objet à la bibliothèque statique correspondante et crée l'exécutable (nommé "main"):
gcc main.o mylibrary.a -o main
Ou en une seule commande:
gcc main.c mylibrary.a -o main
Il peut également s'agir d'un chemin absolu ou relatif:
gcc main.c /usr/local/mylibs/mylibrary.a -o main
Oui, je sais que c'est une question vieille de 8 ans, mais on m'a dit qu'il était possible d'établir un lien statique avec une bibliothèque d'objets partagés et c'était littéralement le premier succès lorsque j'ai cherché plus d'informations à ce sujet.
Pour démontrer en fait que la liaison statique d'une bibliothèque d'objets partagés n'est pas possible avec ld
( gcc
l'éditeur de liens) - par opposition à juste un groupe de personnes insistant sur le fait que ce n'est pas possible - utilisez la gcc
commande suivante :
gcc -o executablename objectname.o -Wl,-Bstatic -l:libnamespec.so
(Bien sûr, vous devrez compiler à objectname.o
partir de sourcename.c
, et vous devriez probablement créer votre propre bibliothèque d'objets partagés également. Si vous le faites, utilisez -Wl,--library-path,.
pour que ld puisse trouver votre bibliothèque dans le répertoire local.)
L'erreur réelle que vous recevez est:
/usr/bin/ld: attempted static link of dynamic object `libnamespec.so'
collect2: error: ld returned 1 exit status
J'espère que cela pourra aider.
Un peu tard mais ... j'ai trouvé un lien que j'ai sauvegardé il y a quelques années et j'ai pensé qu'il pourrait être utile pour vous les gars:
CDE: créer automatiquement des applications Linux portables
http://www.pgbovine.net/cde.html
Exécutez le binaire en passant en argument le nom du binaire que vous souhaitez rendre portable, par exemple: nmap
./cde_2011-08-15_64bit nmap
Le programme lira toutes les bibliothèques liées à nmap et ses dépendances et les enregistrera toutes dans un dossier appelé cde-package / (dans le même répertoire que vous).
N'oubliez pas que pour lancer le programme portable, vous devez exécuter le binaire situé dans cde-package / nmap.cde
Meilleures salutations
Dans gcc, cela n'est pas pris en charge. En fait, cela n'est pris en charge dans aucun compilateur / éditeur de liens existant à ma connaissance.