IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Compilation statique, les bibliothèques ne suivent pas


Sujet :

C++

  1. #1
    Membre confirmé Avatar de humitake
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 399
    Points : 578
    Points
    578
    Par défaut Compilation statique, les bibliothèques ne suivent pas
    Bonjour,

    J'ai un programme qui tourne bien et qui se compile parfaitement mais afin d'éviter de devoir distribuer le programme et demander l'installation des bibliothèques, pour les néophytes, je souhaite compiler en statique.
    Malheureusement je ne trouve pas énormément d'information sur internet et mes connaissances en c++ sont un peu maigres surtout sur les makefiles.

    Lors de la compilation de l'exécutable j'ai rajouté l'option -static mais la compilation me retourne l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /usr/bin/ld: cannot find -lsqlite3
    /usr/bin/ld: cannot find -lmodbus
    collect2: ld returned 1 exit status
    make: *** [FireScanFinal.out] Erreur 1
    Je tiens à préciser que le programme compile parfaitement en mode non statique, je pense que le problème vient donc de mon makefile que voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    FireScanFinal.out : base64.o Historique.o SMS.o Mail.o Main.o Connection.o FireScanError.o FonctionHexa.o Information.o Scan.o FunctionModbusFinsecur.o Enregistrement.o Ecriture.o Comptes.o blowfish.o blowFishWrapper.o BD.o Limitations.o
    	g++ -static -lsqlite3 -lmodbus base64.o Historique.o SMS.o Mail.o Main.o Connection.o FireScanError.o FonctionHexa.o Information.o Scan.o FunctionModbusFinsecur.o Enregistrement.o Ecriture.o Comptes.o blowfish.o blowFishWrapper.o BD.o Limitations.o -o scanSec
     
    Main.o : Mail.h Limitations.h BD/BD.h Connection.h Scan.h FunctionModbusFinsecur.h FireScanError.h Information.h Ecriture.h Enregistrement.h BD/sqlite3.h Main.cpp
    	g++ -c  Main.cpp -lmodbus
     
    Connection.o : modbus.h FireScanError.h Connection.h Connection.cpp
    	g++ -c -lsqlite3 Connection.cpp
     
    FireScanError.o : FireScanError.h FireScanError.cpp
    	g++ -c FireScanError.cpp
     
    FonctionHexa.o : FonctionHexa.h FonctionHexa.cpp
    	g++ -c FonctionHexa.cpp
     
    Information.o : modbus.h FunctionModbusFinsecur.h Connection.h BD/BD.h Information.h Information.cpp
    	g++ -c -lsqlite3 Information.cpp
     
    Scan.o : Connection.h FonctionHexa.h FireScanError.h BD/BD.h BD/sqlite3.h modbus.h Scan.h Scan.cpp
    	g++ -c -lsqlite3 Scan.cpp
     
    FunctionModbusFinsecur.o : FunctionModbusFinsecur.h FunctionModbusFinsecur.cpp
    	g++ -c FunctionModbusFinsecur.cpp
     
    Enregistrement.o : BD/sqlite3.h Blowfish/blowFishWrapper.h FunctionModbusFinsecur.h stdafx.h Enregistrement.h Enregistrement.cpp
    	g++ -c Enregistrement.cpp
     
    Ecriture.o : Connection.h Ecriture.h Ecriture.cpp
    	g++ -c -lsqlite3 Ecriture.cpp
     
    Comptes.o : BD/sqlite3.h BD/BD.h Blowfish/blowFishWrapper.h Comptes.h Comptes.cpp
    	g++ -c Comptes.cpp
     
    blowfish.o : Blowfish/blowfish.h Blowfish/blowfish.h2 Blowfish/blowfish.cpp
    	g++ -c Blowfish/blowfish.cpp
     
    blowFishWrapper.o : Blowfish/blowFishWrapper.h Blowfish/blowFishWrapper.cpp
    	g++ -c Blowfish/blowFishWrapper.cpp
     
    BD.o : Connection.h BD/sqlite3.h BD/BD.h BD/BD.cpp
    	g++ -c -lsqlite3 BD/BD.cpp
     
    Limitations.o : BD/BD.h Blowfish/blowFishWrapper.h BD/sqlite3.h Limitations.h Limitations.cpp
    	g++ -c Limitations.cpp
     
    Mail.o : BD/BD.h Blowfish/blowFishWrapper.h Mail.h Mail.cpp
    	g++ -c Mail.cpp
     
    SMS.o : BD/sqlite3.h BD/BD.h SMS.h SMS.cpp
    	g++ -c -lsqlite3 SMS.cpp
     
    Historique.o : BD/sqlite3.h BD/Historique.h BD/Historique.cpp
    	g++ -c -lsqlite3 BD/Historique.cpp
     
    base64.o : Blowfish/base64.h Blowfish/base64.cpp
    	g++ -c Blowfish/base64.cpp
    J'ai également essayer de rajouter l'option -static à chaque ligne utilisant une bibliothèque puis à toutes les lignes mais le résultat est toujours le même.

    Si quelqu'un peut me donner un coup de pouce
    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Il y a, classiquement, deux raisons qui peuvent faire que l'on obtienne un message du type "cannot find libxxx" :
    • Soit la bibliothèque en question n'est, purement et simplement pas installée
    • Soit la bibliothèque en question est effectivement installée, mais pas dans un des dossiers "classiques" dans lesquels le compilateur recherche les bibliothèques.
    Comme je présumes que tu auras quand meme pensé à installer sqlite, je me dis que tu es sans doute dans le cas N° 2

    Pour faire en sorte que le compilateur aille chercher une (ou des) bibliothèque(s) dans un dossier particulier, il faut généralement ajouter l'option -L à la ligne de commande qui deviendra

    FireScanFinal.out : base64.o Historique.o SMS.o Mail.o Main.o Connection.o FireScanError.o FonctionHexa.o Information.o Scan.o FunctionModbusFinsecur.o Enregistrement.o Ecriture.o Comptes.o blowfish.o blowFishWrapper.o BD.o Limitations.o
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g++ -static -Lchemin/vers/dossier/contenant/sqlite -lsqlite3 -lmodbus base64.o Historique.o SMS.o Mail.o Main.o Connection.o FireScanError.o FonctionHexa.o Information.o Scan.o FunctionModbusFinsecur.o Enregistrement.o Ecriture.o Comptes.o blowfish.o blowFishWrapper.o BD.o Limitations.o -o scanSec
    (comme la recherche de bibliothèque n'intervient qu'au niveau de l'édition de liens, il ne sert à rien de préciser -lsqlite dans les autres lignes )

    Il *peut* cependant exister une dernière situation : tu essaye de lier statiquement à une bibliothèque qui n'existe que sous la forme de bibliothèque partagée (dll sous windows), ou inversement

    Tu devrais maintenant savoir ce qu'il te reste à faire
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre confirmé Avatar de humitake
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 399
    Points : 578
    Points
    578
    Par défaut
    Bonjour et merci, mais cela n'a malheureusement pas résolu mon problème

    Après plusieurs recherche sur le net et des lectures innombrables je me retrouve avec cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g++ -static-libgcc -WL,-static -L/var/www/cpp/ -lmodbus -lsqlite3 base64.o Historique.o SMS.o Mail.o Main.o Connection.o FireScanError.o FonctionHexa.o Information.o Scan.o FunctionModbusFinsecur.o Enregistrement.o Ecriture.o Comptes.o blowfish.o blowFishWrapper.o BD.o Limitations.o -o scanSec
    Pas de changement fabuleux en soit enfin bon
    Le premier soucis était en fait bien le chemin, je n'avait en fait pas placé les .a dans /usr/lib/ donc évidement pas de librairies pas de chocolat !

    Maintenant le programme se compile mais pas correctement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ldd scanSec
    libsqlite3.so.0 => /usr/lib/libsqlite3.so.0 (0x00def000)
    libmodbus.so.5 => /usr/local/lib/libmodbus.so.5 (0x0019a000)

    Pourquoi va t'il chercher mes librairies ailleurs que dans le dossier que je lui indique

  4. #4
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2011
    Messages
    1 255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 255
    Points : 2 627
    Points
    2 627
    Par défaut
    Euh ... On dirait que le link est dynamique.

    Si j'ai bien compris ce que tu veux, la commande ldd n'aurait jamais dû retourner les dépendances à sqlite et modbus.

    En général, les bibliothèques statiques ont l'extension .a (.lib sous Windows) et les dynamiques .so (.dll sous Windows)

    Je ne maîtrise pas gcc, mais il faut peut-être linker explicitement les lib statiques : -lmodbus.a -lsqlite3.a

  5. #5
    screetch
    Invité(e)
    Par défaut
    -Wl,-Bstatic est l'option je crois

  6. #6
    Membre confirmé Avatar de humitake
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 399
    Points : 578
    Points
    578
    Par défaut
    Bonjour et merci pour vos réponse, l'option -lxxx.a ne fonctionne malheureusement pas. Pour l'option -Wl,-Bstatic je n'ai pas encore testé car j'ai supprimer tous les fichiers et la un autre problème survient (décidément ...), je n'arrive plus à obtenir le fichier libmodbus.a
    J'ai de nouveau téléchargé la bibliothèque puis je l'es compilé et j'obtiens trois type de fichier différent :
    • .so, qui ne m'interesse pas

    • .lai, je ne sais pas ce que c'est

    • .la, je ne sais pas non plus ce que c'est ...

    Mais pas de fichier .a ...

    En compilant sous Windows (on sait jamais) j'ai un fichier .dll.a, ce dernier peut-il être utilisé en tant que bibliothèque statique sous linux ?

    Je regarde mes notes afin de voir ou j'avais obtenu le fichier .a mais c'est pour l'instant toujours un mystère

  7. #7
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2011
    Messages
    1 255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 255
    Points : 2 627
    Points
    2 627
    Par défaut
    Citation Envoyé par humitake Voir le message
    En compilant sous Windows (on sait jamais) j'ai un fichier .dll.a, ce dernier peut-il être utilisé en tant que bibliothèque statique sous linux ?
    Non !!! Un binaire compilé (même avec gcc) sous Windows n'est pas compatible avec un autre OS.

  8. #8
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par humitake Voir le message
    Bonjour et merci pour vos réponse, l'option -lxxx.a ne fonctionne malheureusement pas.
    Normal. Par contre, libxxx.a fonctionnera (l'option -l$nom tente de construire le nom d'une librairie sous la forme lib$nom.a ou lib$nom.so ; passer -lxxx.a cherchera à linker avec la librairie libxxx.a.a ou libxxx.a.so).

    Citation Envoyé par humitake Voir le message
    • .lai, je ne sais pas ce que c'est

    • .la, je ne sais pas non plus ce que c'est ...

    Mais pas de fichier .a ...
    Ce sont des fichiers texte générés par libtool. Rien de bien intéressant. Par contre, qui dit libtool dit (généralement) configure. Et le script configure prends certainement une option --disable-shared, qui permet de forcer libtool à créer des librairies statiques.

    Citation Envoyé par humitake Voir le message
    En compilant sous Windows (on sait jamais) j'ai un fichier .dll.a, ce dernier peut-il être utilisé en tant que bibliothèque statique sous linux ?
    Non - pas la même ABI, et plein d'autres choses différentes.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  9. #9
    Membre confirmé Avatar de humitake
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 399
    Points : 578
    Points
    578
    Par défaut
    Citation Envoyé par Emmanuel Deloget
    Et le script configure prends certainement une option --disable-shared, qui permet de forcer libtool à créer des librairies statiques.
    Super j'ai pu compiler statiquement la bibliothèque

    Par contre je n'arrive pas à l'inclure statiquement dans mon makefile ...
    Au moment de la compilation il ne trouve pas le fichier même si je lui indique le chemin avec l'option -L puis en utilisant ensuite -lmodbus. J'ai également essayer de faire : /chemin/de/la/lib/libmodbus.a mais rien à faire il me sort toujours :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    g++ -static-libgcc -WL,-Bstatic -L/var/www/cpp/ -lmodbus -lsqlite3 base64.o Historique.o SMS.o Mail.o Main.o Connection.o FireScanError.o FonctionHexa.o Information.o Scan.o FunctionModbusFinsecur.o Enregistrement.o Ecriture.o Comptes.o blowfish.o blowFishWrapper.o BD.o Limitations.o -o scanSec
    Connection.o: In function `Connection::Connection(char const*)':
    Connection.cpp:(.text+0x17): undefined reference to `modbus_new_tcp'
    Connection.cpp:(.text+0xe6): undefined reference to `modbus_connect'
    Connection.cpp:(.text+0x10e): undefined reference to `modbus_strerror'
    [...]
    collect2: ld returned 1 exit status
    make: *** [FireScanFinal.out] Erreur 1

  10. #10
    screetch
    Invité(e)
    Par défaut
    A priori la il la trouve, la bibliothèque. Par contre, il ne trouve pas les fonctions qui sont dedans.
    Essaye un nm /chemin/de/la/lib/libmodbus.a | grep modbus_new_tcp

  11. #11
    Membre confirmé Avatar de humitake
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 399
    Points : 578
    Points
    578
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    :/var/www/cpp$ nm libmodbus.a | grep modbus_new_tcp
    00000720 T modbus_new_tcp

  12. #12
    screetch
    Invité(e)
    Par défaut
    et si tu mets les options après les .o?

  13. #13
    Membre confirmé Avatar de humitake
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 399
    Points : 578
    Points
    578
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    linux-gate.so.1 =>  (0x0072d000)
            libsqlite3.so.0 => /usr/lib/libsqlite3.so.0 (0x0079a000)
            libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00cff000)
            libm.so.6 => /lib/libm.so.6 (0x00cc4000)
            libc.so.6 => /lib/libc.so.6 (0x00e21000)
            libpthread.so.0 => /lib/libpthread.so.0 (0x00abe000)
            libdl.so.2 => /lib/libdl.so.2 (0x00736000)
            /lib/ld-linux.so.2 (0x00461000)
            libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00a99000)
    Plus de libmodbus dans la liste le .a a bien été inclut !


    Je ne savais pas que la position des options changeait quelques chose ... Mille merci

  14. #14
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Les scripts de link de gcc font que si un le module A utilise le symbole xxx défini dans le module B, alors A dépends de B et A doit être spécifié avant B dans la liste des modules à lier. Du coup, généralement, on précise la liste des librairies après la liste des .o qu'on lie - de manière à ce que le point précédent soit respecté dans la plupart des cas (les exceptions étant des cas tordus, notament lorsq'un symbole weak est déclaré et redéfini dans un programme ; il peut être alos nécessaire de spécifier plusieurs fois le même module (librairie ou fichier objet) sur la ligne de commande).
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  15. #15
    Membre confirmé Avatar de humitake
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 399
    Points : 578
    Points
    578
    Par défaut
    Merci de l'info c'est toujours bon à savoir

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 21/04/2014, 13h52
  2. Toutes les bibliothèques ne sont pas présentes
    Par Gabrielly dans le forum Bibliothèques
    Réponses: 4
    Dernier message: 15/07/2009, 09h02
  3. Réponses: 20
    Dernier message: 04/06/2008, 02h08
  4. Réponses: 4
    Dernier message: 18/12/2007, 21h54
  5. Debutant : les tests ne sont pas compilés
    Par jdvacheron dans le forum Maven
    Réponses: 1
    Dernier message: 03/07/2007, 17h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo