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

Systèmes de compilation Discussion :

Erreur en passant de g++ en ligne à makefile


Sujet :

Systèmes de compilation

  1. #1
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Par défaut Erreur en passant de g++ en ligne à makefile
    Bonjour,
    je travaille sur un projet mixant fichiers C++ et C.
    Compiler en ligne de commande ne me pose pas de problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g++ -Wall -std=c++11 main.cpp gps.cpp led.cpp oled.cpp fontx.c client_http.cpp -lwiringPi
    J'ai écrit un makefile pour me faciliter la vie:
    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
    29
    30
    CC=g++
    CFLAGS=-Wall -std=c++11
    LDFLAGS=-lwiringPi
    EXEC=tracker
     
    all: $(EXEC)
     
    tracker: main.o client_http.o gps.o oled.o led.o fontx.o
    	$(CC) $(CFLAGS) -o tracker main.o gps.o client_http.o oled.o led.o fontx.o $(LDFLAGS)
     
    main.o: main.cpp
    	$(CC) -o main.o -c main.cpp $(CFLAGS)
     
    client_http.o: client_http.cpp
    	$(CC) -o client_http.o -c client_http.cpp $(CFLAGS)
     
    gps.o: gps.cpp
    	$(CC) -o gps.o -c gps.cpp $(CFLAGS)
     
    oled.o: oled.cpp fontx.h
    	$(CC) -o oled.o -c oled.cpp $< $(CFLAGS)
     
    led.o: led.cpp
    	$(CC) -o led.o -c led.cpp $(CFLAGS)
     
    fontx.o: fontx.c
    	gcc -o fontx.o -c fontx.c -Wall
     
    clean:
    	rm -rf *.o
    oled.cpp utilise des fonctions déclarées dans fontx.h, j'ai donc placé une dépendance à ce qui me semble être le bon endroit mais j'ai toujours des erreurs du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    g++ -Wall -std=c++11 -o tracker main.o gps.o client_http.o oled.o led.o fontx.o -lwiringPi
    oled.o*: Dans la fonction «*Oled::Oled(int)*»*:
    oled.cpp:(.text+0x9c)*: référence indéfinie vers «*Fontx_init(FontxFile*, char const*, char const*)*»
    oled.o*: Dans la fonction «*Oled::drawSJISChar(FontxFile*, int, int, unsigned short, unsigned char, unsigned char)*»*:
    oled.cpp:(.text+0x20c)*: référence indéfinie vers «*GetFontx(FontxFile*, unsigned int, unsigned char*, unsigned char*, unsigned char*)
    Je lis le tuto de GL mais je bloque...
    Si quelqu'un a une idée.
    Merci

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 595
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 595
    Par défaut
    Bonjour,

    Je ne connais pas bien gcc, je suis étonné que l'édition des liens puisse se faire.
    Une fonction C++ ne peut pas appeler appeler une fonction C si on n'a pas prévenu que c'est du code C.
    Un moyen qui devrait marcher c'est d'indiquer que tout ce qui est dans fontx.h est du C, pour cela il faudrait encadrer les includes "fontx.h" qui sont dans du code C++ de la manière suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    extern "C" {
    #include "fontx.h"
    }

  3. #3
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Par défaut
    Bonjour et merci pour ta réponse.
    Ca fonctionne avec tous les fichiers C utilisés dans le projet.
    Je ne connaissais pas cette technique. Ce qui m'interpelle maintenant c'est que ça fonctionne en ligne de commande (le link se passe donc bien). Quelle est la différence avec l'utilisation des mêmes fichiers dans un makefile?
    Si tu as la réponse et 5mn à y consacrer...
    Merci.

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 595
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 595
    Par défaut
    Citation Envoyé par rdtech Voir le message
    Bonjour et merci pour ta réponse.
    Ca fonctionne avec tous les fichiers C utilisés dans le projet.
    Je ne connaissais pas cette technique. Ce qui m'interpelle maintenant c'est que ça fonctionne en ligne de commande (le link se passe donc bien). Quelle est la différence avec l'utilisation des mêmes fichiers dans un makefile?
    Si tu as la réponse et 5mn à y consacrer...
    Merci.
    Comme je l'ai indiqué, selon moi ça ne devrait pas marcher!
    Quand tu le fais en ligne tu demandes en même temps la compilation et l'édition des liens. Peut-être que dans cas gcc "voit" que des fonctions sont C et d'autres C++ et effectue automatiquement la conversion.
    Quand tu le fais via makefile. On a les compilations d'un côté puis finalement une édition des liens, et au moment de l'édition des liens il est trop tard pour bidouiller. C'est le fonctionnement auquel on devrait s'attendre.
    C'est une spécificité de gcc de supporter ce mélange quand tu fais tout en une ligne, mais je suis sûr que sur d'autres compilateurs ça ne marcherait pas. Le C et le C++ ne s'interfacent pas automatiquement.

Discussions similaires

  1. Erreur d'exécution un DTS en ligne de commande
    Par bigey3 dans le forum MS SQL Server
    Réponses: 0
    Dernier message: 16/04/2008, 13h12
  2. Erreur lors de la suppression de lignes vides
    Par Lechette dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 03/04/2008, 11h56
  3. [GD] Erreur 500 avec script d'une ligne
    Par keul dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 24/09/2007, 11h50
  4. [MySQL] problème : Erreur de syntaxe près de '' à la ligne 1
    Par Amandine62 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 24/02/2007, 20h28
  5. [MySQL] Erreur de syntaxe près de ' '', '', à la ligne 1
    Par micka30 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 06/01/2007, 03h29

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