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

Boost C++ Discussion :

Linker filesystem en static


Sujet :

Boost C++

  1. #1
    Membre habitué
    Avatar de Nykoo
    Profil pro
    Inscrit en
    février 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2007
    Messages : 234
    Points : 166
    Points
    166
    Par défaut Linker filesystem en static
    Je voudrais intégrer la librairie filesystem dans mon exécutable. Je compile avec gcc 3.4.2 de MinGW avec le makefile suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    EXEC = test
    IPATHS = -IC:\Developpement\boost_1_39_0
    LPATHS = -LC:\Developpement\boost_1_39_0\stage\lib
    LFLAGS = -lboost_filesystem-mgw34 -lboost_system-mgw34
     
    $(EXEC): main.o
    	g++ -static $(LPATHS) $^ $(LFLAGS)
     
    main.o: main.cpp
    	g++ $(IPATHS) -c $^
    Mais j'utilise mal l'option -static apparemment puisque j'ai toujours besoin des dlls. J'espère que vous pourrez 'aider à trouver mon erreur. Merci.

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : octobre 2004
    Messages : 11 526
    Points : 29 983
    Points
    29 983
    Par défaut
    Salut,

    Le fait est que boost::filesystem est une bibliothèque qui n'existe qu'en version dynamique

    La seule solution potentielle que je puisse envisager (et je t'avoue qu'elle "m'effraie" quelque peu tant elle est peu orthodoxe (re ) ), ce serait d'introduire directement l'ensemble des en-tête et des fichiers d'implémentation de cette bibliothèque dans ton projet, en veillant à ce que la macro BOOST_FILESYSTEM_DECL (qui défini selon le cas __declspec(dllimport) ou __declspec(dllexport) ) soit définie à ... rien du tout...
    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 expérimenté

    Profil pro
    Inscrit en
    juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : juin 2006
    Messages : 1 294
    Points : 1 516
    Points
    1 516
    Par défaut
    Salut,

    Citation Envoyé par koala01 Voir le message
    Le fait est que boost::filesystem est une bibliothèque qui n'existe qu'en version dynamique
    Pas que je sache non (en tous cas j'ai des versions statiques sous cygwin et macos).

    MAT.

  4. #4
    Membre habitué
    Avatar de Nykoo
    Profil pro
    Inscrit en
    février 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2007
    Messages : 234
    Points : 166
    Points
    166
    Par défaut
    Ah mince, c'est le cas spécial de filesystem ou de plusieurs autres? Je vais rester avec les dll du coup, sinon trop d'efforts pour pas grand chose.

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : juin 2006
    Messages : 1 294
    Points : 1 516
    Points
    1 516
    Par défaut
    C'était le cas il y a longtemps mais depuis au moins quelques années toutes les bibliothèques peuvent être liées statiquement sur toutes les plates-formes, à ce que je sache...

    MAT.

  6. #6
    Membre habitué
    Avatar de Nykoo
    Profil pro
    Inscrit en
    février 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2007
    Messages : 234
    Points : 166
    Points
    166
    Par défaut
    Peut être qu'il faut que je recompile filesystem avec l'option link=static de bjam:

    Properties:

    toolset=toolset Indicates the toolset to build with.

    variant=debug|release Select the build variant

    link=static|shared Whether to build static or shared libraries

    threading=single|multi Whether to build single or multithreaded binaries

    runtime-link=static|shared
    Whether to link to static or shared C and C++ runtime.
    Je vais tenter ça.

    2ème hypothèse: j'ai linké avec une librairie sans suffixe du type "sd" ou "mt". En fait il doit y avoir des versions statiques, multithread...etc

    Je vais tester avec les sd en supposant que le "s" veuille dire static.

  7. #7
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    octobre 2004
    Messages
    11 526
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : octobre 2004
    Messages : 11 526
    Points : 29 983
    Points
    29 983
    Par défaut
    Citation Envoyé par Mat007 Voir le message
    Salut,


    Pas que je sache non (en tous cas j'ai des versions statiques sous cygwin et macos).

    MAT.
    Effectivement, lorsque tu utilise cygwin, tu es dans un environnement posix, mais, d'après le config.hpp propre à filesystem, il semble que tout soit fait pour que si tu travailles sous environnement windows réel, la bibliothèque soit créée sous la forme d'une dll

    Le fait est que la gestion du système de fichier est alors déléguée à l'API windows, qui fait elle-même appel à plusieurs dll...

    Ceci expliquant cela
    Citation Envoyé par Nykoo Voir le message
    Ah mince, c'est le cas spécial de filesystem ou de plusieurs autres? Je vais rester avec les dll du coup, sinon trop d'efforts pour pas grand chose.
    A ma connaissance, mais sous réserve de vérification, il y a trois ou quatre bibliothèques dans le cas
    Citation Envoyé par Mat007 Voir le message
    C'était le cas il y a longtemps mais depuis au moins quelques années toutes les bibliothèques peuvent être liées statiquement sur toutes les plates-formes, à ce que je sache...

    MAT.
    Disons que, par défaut, elles restent générées sous la forme de dll...

    Maintenant, il n'est pas exclu qu'elles aient évolué pour pouvoir être dénérées sous forme de bibliothèque statique

    Mais il faut sans doute alors le demander explicitement
    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

  8. #8
    Membre habitué
    Avatar de Nykoo
    Profil pro
    Inscrit en
    février 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2007
    Messages : 234
    Points : 166
    Points
    166
    Par défaut
    Bon ça marche avec les librairies avec le suffixe "s" (boost_filesystem-mgw34-s.lib et boost_system-mgw34-s.lib). C'est bien linké en static plus besoin de dll.

    J'ai compilé filesystem avec bjam sans spécifier l'option link, donc il m'a sorti toutes les versions possible des librairies, soit une 20aine par librairie

    Par contre c'est la merde parce que les librairies se finissent en ".lib" et ne sont pas toutes précédées de "lib". Donc le linker avec l'option -lfilesystem va me chercher libfilesystem.a et ne les trouve pas c'est logique. J'ai donc dû renommer les librairies c'est pas très propre.

  9. #9
    Membre expérimenté

    Profil pro
    Inscrit en
    juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : juin 2006
    Messages : 1 294
    Points : 1 516
    Points
    1 516
    Par défaut
    Citation Envoyé par Nykoo Voir le message
    Par contre c'est la (...) parce que les librairies se finissent en ".lib" et ne sont pas toutes précédées de "lib". Donc le linker avec l'option -lfilesystem va me chercher libfilesystem.a et ne les trouve pas c'est logique. J'ai donc dû renommer les librairies c'est pas très propre.
    Quelle version de bjam tu as utilisée ?
    Je sais que sous cygwin il faut le recompiler et non utiliser la version binaire x86 fournie, sinon ça fait exactement ce que tu décris : ça crée des .lib et au lieu des .a

    MAT.

  10. #10
    Membre habitué
    Avatar de Nykoo
    Profil pro
    Inscrit en
    février 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2007
    Messages : 234
    Points : 166
    Points
    166
    Par défaut
    bjam me dis:
    Boost.Build V2 (Milestone 12)
    Boost.Jam 03.1.17
    La dernière release de sourceforge version ntx86, donnée en lien à partir de http://www.boost.org/users/download/

    J'ai compilé avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bjam --build-dir=build toolset=gcc --build-type=complete

  11. #11
    Membre expérimenté

    Profil pro
    Inscrit en
    juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : juin 2006
    Messages : 1 294
    Points : 1 516
    Points
    1 516
    Par défaut
    Ok donc tu peux essayer en recompilant bjam, ce qui se fait depuis la racine de boost avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    cd tools/jam/src/
    ./build.sh
    cd ../../..
    Et ensuite pour compiler boost :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tools/jam/src/bin.cygwinx86/bjam.exe (etc..)
    MAT.

  12. #12
    Membre habitué
    Avatar de Nykoo
    Profil pro
    Inscrit en
    février 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2007
    Messages : 234
    Points : 166
    Points
    166
    Par défaut
    J'ai essayé avec le buil.bat (je suis sous Xp), mais j'ai toujours des *.lib M'emfin c'est pas un gros problème je trouverai peut être la solution plus tard par hasard.

  13. #13
    Membre expérimenté

    Profil pro
    Inscrit en
    juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : juin 2006
    Messages : 1 294
    Points : 1 516
    Points
    1 516
    Par défaut
    Ok, peut-être que ce n'est valable que pour cygwin...

    MAT.

Discussions similaires

  1. linker libxml2 en static avec Eclipse
    Par Bludy dans le forum C++
    Réponses: 2
    Dernier message: 29/12/2009, 04h21
  2. Galère pour linker en static
    Par ads59 dans le forum Eclipse C & C++
    Réponses: 0
    Dernier message: 23/11/2009, 17h28
  3. [Help]Membre static et Linker Error
    Par elix63 dans le forum C++
    Réponses: 2
    Dernier message: 18/04/2008, 15h20
  4. Réponses: 5
    Dernier message: 02/04/2008, 14h42
  5. comment linker en static
    Par Jérémy Lefevre dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 23/11/2006, 18h00

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