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

Bibliothèques C++ Discussion :

problème de linkage avec gcc


Sujet :

Bibliothèques C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 18
    Points : 15
    Points
    15
    Par défaut problème de linkage avec gcc
    /*
    Bonjour à tous,
    je n'arrive pas à compiler le projet C++ suivant

    ci-dessous les codes du projet "hello world !" avec trois fichiers
    - le main.cpp à la racine
    - un sous-dossier avec deux fichiers sources, destinés à faire une
    petite bibliothèque partagée

    avec GCC la compilation se passe bien (fichier Makefile plus bas)
    jusqu'à l'édition de liens avec le main
    qui me donne un message d'erreur "undefined reference to ..." tous mes objets

    au secours
    */

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     --- Projet
      |
      +-- [ build-aux ]
      |         |
      |         +-- basic_window.cpp
      |         +-- singleton.cpp
      +-- main.cpp
      |
      +-- Makefile
    main.cpp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdio.h>
    #include <iostream>
    #include "build-aux/basic_window.hpp"
     
    int main()
    {
        BasicWindow& win1 = Singleton<BasicWindow>::instance();
        BasicWindow& win2 = Singleton<BasicWindow>::instance();
        std::cout << &win1 << "|" << &win2 << std::endl ;
        win1.say_hello();
        win2.say_goodbye();
        //
        return 0;
    }
    basic_window.cpp :

    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
    #include <stdio.h>
    #include <iostream>
    #include "basic_window.hpp"
     
    using namespace std ;
     
    BasicWindow::BasicWindow()
    {
        cout << "Creation" << endl ;
    }
     
    BasicWindow::~BasicWindow()
    {
        cout << "Destruction" << endl ;
    }
     
    void BasicWindow::say_goodbye()
    {
        printf("Goodbye !\n");
    }
     
    void BasicWindow::say_hello()
    {
        printf("Hello !\n");
    }
    singleton.cpp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdio.h>
    #include <iostream>
    #include "singletontpl.hpp"
     
    using namespace std ;
     
    template <class T> T Singleton<T>::m_i = T();
     
    template <class T> T& Singleton<T>::instance()
    {
        return m_i;
    }
    Makefile :

    Code Makefile : 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
    RM := rm -rf
     
    # All Target
    all: libempty.so foobar
     
    # Each subdirectory must supply rules for building sources it contributes
    build-aux/%.o: build-aux/%.cpp
      /usr/bin/g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o "$@" "$<"
     
    libempty.so: build-aux/singletontpl.o build-aux/basic_window.o
      /usr/bin/g++ -shared -rdynamic "$<" -o "$@" -fPIC
     
    main.o: main.cpp
     /usr/bin/g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o "$@" "$<"
     
    foobar: main.o
      /usr/bin/g++ -Ibuild-aux -o "$@" "$<" -lempty -L. -Wl,-rpath,. -e main
     
    # Other Targets
    clean:
        -$(RM) foobar.o \
            build-aux/basic_window.o \
            build-aux/singletontpl.o \
            libempty.so \
            foobar
     
    .PHONY: all clean
    .SECONDARY:

    /*
    comme je le disais, ça compile ok jusqu'au linkage,
    le message d'erreur recraché par gcc (ld) est :
    */

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Invoking: Cross G++ Linker
    /usr/bin/g++ -Ibuild-aux -o "foobar" "main.o" -lempty -L. -Wl,-rpath,. -e main
    main.o: In function `main':
     
    /home/centipede/Documents/1.workspace/singletontpl//main.cpp:26: undefined reference to `Singleton<BasicWindow>::instance()'
    Makefile:33: recipe for target 'foobar' failed
    /home/centipede/Documents/1.workspace/singletontpl//main.cpp:27: undefined reference to `Singleton<BasicWindow>::instance()'
    /home/centipede/Documents/1.workspace/singletontpl//main.cpp:29: undefined reference to `BasicWindow::say_hello()'
    /home/centipede/Documents/1.workspace/singletontpl//main.cpp:30: undefined reference to `BasicWindow::say_goodbye()'
    collect2: error: ld returned 1 exit status
    make: *** [foobar] Error 1
    /*
    questions : - manque-t-il une ou des options de GCC quelque part ?
    - manque-t-il qualque chose dans le Makefile ?
    - manque-t-il quelque chose dans le source ?
    - manque-t-il une configuration à gcc ?

    d'avance merci ...

    laglumie

    */

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Les template s'implémentent dans les fichiers d'en-tête.
    https://cpp.developpez.com/faq/cpp/?...-les-templates
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 18
    Points : 15
    Points
    15
    Par défaut Problème résolu.
    Merci. Problème résolu.

    De ce fait, dans le Makefile, la règle de création de la bibliothèque partagée peut-être modifiée ainsi :
    (on omet singletontpl.o puisqu'il est déjà inclus dans un en-tête)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    libempty.so: build-aux/basic_window.o
    	@echo 'Building target: $@'
    	@echo 'Invoking: Cross G++ Linker'
    	/usr/bin/g++ -shared -rdynamic -fPIC -o "libempty.so" "$<"
    	@echo 'Finished building target: $@'
    	@echo ' '
    Reste une segfault à l'éxécution de ce programme. Si quelqu'un sait pourquoi... (sinon GDB !)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    centipede@obiwan:singletontpl$ ./foobar 
    0x4e803a|0x4e803a
    Hello !
    Goodbye !
    Segmentation fault
    Merci encore !

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 18
    Points : 15
    Points
    15
    Par défaut Problème résolu.
    main() se termine par un exit (0) sous Linux, et non par un return (), problème résolu donc.

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

Discussions similaires

  1. Problème au linkage avec mfc42d
    Par GLDavid dans le forum VC++ .NET
    Réponses: 6
    Dernier message: 04/01/2007, 11h32
  2. [linux] problème d'inclusion avec gcc
    Par wtfu dans le forum C
    Réponses: 3
    Dernier message: 12/07/2006, 14h49
  3. Problème pour compiler avec gcc
    Par Mick.Zen dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 28/06/2006, 14h05
  4. Réponses: 5
    Dernier message: 09/04/2006, 19h02
  5. Problème de linkage avec la librairie DevIl
    Par Drannor dans le forum DevIL
    Réponses: 1
    Dernier message: 18/01/2006, 23h05

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