Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1175 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  DevC++ Compilation projet et options

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

DevC++ Compilation projet et options

n°1706400
Pwill
Deux fois Né
Posté le 22-03-2008 à 00:03:44  profilanswer
 

Bonjour,
 
Voilà j'ai un projet c++ tout simple composé des fichiers suivants:
entrainement.h
sportif.h
main.cpp
sportif.a
 
Pour compiler sous UNIX je fais ca:
g++ -Wall -pedantic -Werror -c main.cpp
g++ main.o sportif.a -o monexe
 
Tout se passe bien.
 
Mais quand j'ajoute ces 4 fichiers au projet sous Dev C++ (dernière version beta) et que j'ajoute sportif.a dans la colonne Editeur de liens, j'obtiens un paquet d'erreur du genre :

Code :
  1. -
  2. Compilateur: Default compiler
  3. Building Makefile: "D:\cpp\Makefile.win"
  4. Exécution de  make clean
  5. rm -f ../cpp/main.o  Entrainement.exe
  6. g++.exe -c main.cpp -o ../cpp/main.o -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include"  -I"C:/Dev-Cpp/include/c++/3.4.2/backward"  -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32"  -I"C:/Dev-Cpp/include/c++/3.4.2"  -I"C:/Dev-Cpp/include"  -Wall -Werror -pedantic 
  7. g++.exe ../cpp/main.o  -o "Entrainement.exe" -L"C:/Dev-Cpp/lib" sportif.a 
  8. ../cpp/main.o(.text+0x19a):main.cpp: undefined reference to `Sportif::Sportif()'
  9. ../cpp/main.o(.text+0x215):main.cpp: undefined reference to `Entrainement::creerEntrainement(float, float, float, float, float, float)'
  10. ../cpp/main.o(.text+0x252):main.cpp: undefined reference to `Entrainement::creerEntrainement(float, float, float, float, float, float)'
  11. [...]
  12. Compilateur: Default compiler
  13. Building Makefile: "D:\cpp\Makefile.win"
  14. Exécution de  make clean
  15. rm -f ../cpp/main.o  Entrainement.exe
  16. g++.exe -c main.cpp -o ../cpp/main.o -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include"  -I"C:/Dev-Cpp/include/c++/3.4.2/backward"  -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32"  -I"C:/Dev-Cpp/include/c++/3.4.2"  -I"C:/Dev-Cpp/include"  -Wall -Werror -pedantic 
  17. g++.exe ../cpp/main.o  -o "Entrainement.exe" -L"C:/Dev-Cpp/lib" sportif.a 
  18. ../cpp/main.o(.text+0x19a):main.cpp: undefined reference to `Sportif::Sportif()'
  19. ../cpp/main.o(.text+0x215):main.cpp: undefined reference to `Entrainement::creerEntrainement(float, float, float, float, float, float)'
  20. ../cpp/main.o(.text+0x252):main.cpp: undefined reference to `Entrainement::creerEntrainement(float, float, float, float, float, float)'


 
Je suis allé voir le Makefile, j'ai tenté de le modifier pour que ca marche, mais je n'obtiens rien de mieux... Celui qu'il génère ressemble à ca :

Code :
  1. # Project: Entrainement
  2. # Makefile created by Dev-C++ 4.9.9.2
  3. CPP  = g++.exe
  4. CC   = gcc.exe
  5. WINDRES = windres.exe
  6. RES  =
  7. OBJ  = ../cpp/main.o $(RES)
  8. LINKOBJ  = ../cpp/main.o $(RES)
  9. LIBS =  -L"C:/Dev-Cpp/lib" sportif.a 
  10. INCS =  -I"C:/Dev-Cpp/include"
  11. CXXINCS =  -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include"  -I"C:/Dev-Cpp/include/c++/3.4.2/backward"  -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32"  -I"C:/Dev-Cpp/include/c++/3.4.2"  -I"C:/Dev-Cpp/include"
  12. BIN  = Entrainement.exe
  13. CXXFLAGS = $(CXXINCS) -Wall -Werror -pedantic 
  14. CFLAGS = $(INCS) 
  15. RM = rm -f
  16. .PHONY: all all-before all-after clean clean-custom
  17. all: all-before Entrainement.exe all-after
  18. clean: clean-custom
  19. ${RM} $(OBJ) $(BIN)
  20. $(BIN): $(OBJ)
  21. $(CPP) $(LINKOBJ) -o "Entrainement.exe" $(LIBS)
  22. ../cpp/main.o: main.cpp
  23. $(CPP) -c main.cpp -o ../cpp/main.o $(CXXFLAGS)


 
Que puis-je faire pour pouvoir compiler sous DevC++ ?
Merci d'avance à ceux qui jetteront un oeil :jap:


Message édité par Pwill le 22-03-2008 à 00:04:46
mood
Publicité
Posté le 22-03-2008 à 00:03:44  profilanswer
 

n°1706401
Joel F
Real men use unique_ptr
Posté le 22-03-2008 à 00:08:10  profilanswer
 

utiliser code::blocks car DevC++ n'est plus maintenu :o

 

Ah et ton .a il sort de linux ? Il faut certainement le recompilé sur ton windows ;)


Message édité par Joel F le 22-03-2008 à 00:08:40
n°1706535
Pwill
Deux fois Né
Posté le 22-03-2008 à 13:53:06  profilanswer
 

Pour le .a, c'est le prof qui nous le fournit, le but du jeu étant de deviner ce qu'il s'y cache. Il sort très probablement de Linux mais j'imagine que c'est compilé avec minGW :??:
Bon je tente avec Code::Blocks :)
 
Merci.


Message édité par Pwill le 22-03-2008 à 13:53:30
n°1706542
Joel F
Real men use unique_ptr
Posté le 22-03-2008 à 14:09:42  profilanswer
 

bah si ca sort d'un linux c'ets compilé sosu forme d'ELF ... donc pas sur que mingw le lise :[

n°1706722
Ace17
Posté le 23-03-2008 à 11:09:14  profilanswer
 

objdump ...

n°1706798
Pwill
Deux fois Né
Posté le 23-03-2008 à 18:26:18  profilanswer
 

Pour simple vérification, c'est normal que Code::Blocks me sorte des erreurs du type D:\cpp\Entrainement\main.cpp|86|undefined reference to `Sportif::Sportif()'| alors qu'il y a bien un #include sportif.h qui contient tous les prototypes ?
 
Je ne connais pas objdump, et n'ayant pas d'Unix sous la main, je vais surement devoir passer par cygwin.
En attendant je regarde ce que peut donner IDA.
 
Merci à tous les deux.

n°1706799
Pwill
Deux fois Né
Posté le 23-03-2008 à 18:34:12  profilanswer
 

Bon ben IDA me sort du code assembleur, ca me confirme bien que c'est au format ELF (Relocatable)... A part ca je sais pas trop quelles infos en tirer.

n°1706824
olivthill
Posté le 23-03-2008 à 20:03:53  profilanswer
 

Il est possible de compiler un projet contenant un un fichier ".a " avec Dev-Cpp, car j'y suis arrivé. Mais peut-être que ce n'est pas possible avec tous les fichiers ".a". J'ai peut-être eu de la chance. Voici ce que j'ai fait :
 
1. Créer un projet qui inclut les fichiers ".c" ou ".cpp" et ".h", "rc" éventuellement, mais pas le fichier ".a", car c'est du binaire qui n'a pas besoin d'être recompiler.
2. Placer le fichier ".a" dans le répertoire où se trouve les autres bibliothèques, en l'occurence chez moi, dans c:\Dev-Cpp\lib.
3. Dans "Project options", onglet "Parameters", textarea "Linker",
 ajouter "-lnom_du_fichier_sans_le_prefixe_lib_sans_suffixe_point_a".
Dans mon cas la bibliothèque s'appelait "libjpeg.a". J'ai écrit "-ljpeg"
C'est tout.
 
Mon makefile contient, en autres choses :

LIBS =  -L"C:/DEV-CPP/lib" -mwindows -ljpeg  
INCS =  -I"C:/DEV-CPP/include"


Une différence que je constate, qui est peut-être importante, je ne sais pas, est le nom de la bibliothèque. D'habitude, elles commencent toutes par les trois lettres "lib". C'est une tradition qui remonte à ma jeunesse. A votre place, j'essayerais de renommer le fichier sportif.a en libsportif.a, et de mettre "-lsportif" (sans les guillemets) dans l'onglet "Parameters" des "Project Options".


Message édité par olivthill le 23-03-2008 à 20:08:41
n°1706948
Pwill
Deux fois Né
Posté le 24-03-2008 à 14:18:44  profilanswer
 

Merci pour votre contribution très claire et très intéressante. :jap:
En suivant vos indications, à priori il trouve bien libsportif.a mais j'obtiens les mêmes erreurs que sous Code::Block (où j'inclus le .a à l'édition de liens dans les options du projet)
 

Code :
  1. Finding dependencies for file: D:\cpp\main.cpp
  2. Executing  make...
  3. make.exe -f "D:\cpp\Makefile.win" all
  4. g++.exe main.o  -o "Test.exe" -L"C:/Dev-Cpp/lib" -lsportif 
  5. main.o(.text+0x19a):main.cpp: undefined reference to `Sportif::Sportif()'
  6. main.o(.text+0x215):main.cpp: undefined reference to `Entrainement::creerEntrainement(float, float, float, float, float, float)'
  7. main.o(.text+0x346):main.cpp: more undefined references to `Entrainement::creerEntrainement(float, float, float, float, float, float)' follow
  8. main.o(.text+0x35b):main.cpp: undefined reference to `Sportif::entrainer(Entrainement*)'
  9. main.o(.text+0x37b):main.cpp: undefined reference to `Sportif::courir(float*&, float*&, float*& )'
  10. main.o(.text+0x4ff):main.cpp: undefined reference to `Sportif::entrainer(Entrainement*)'
  11. main.o(.text+0x51f):main.cpp: undefined reference to `Sportif::courir(float*&, float*&, float*& )'
  12. collect2: ld returned 1 exit status
  13. make.exe: *** [Test.exe] Error 1
  14. Execution terminated


 
 
J'ai bien un makefile semblable au votre.  
Finalement ca revient au même que si j'inclus simplement le .a dans l'édition de liens du projet. :( Dommage, merci quand même :)


Message édité par Pwill le 24-03-2008 à 14:23:11
n°1711257
Pwill
Deux fois Né
Posté le 01-04-2008 à 20:36:03  profilanswer
 

Bonsoir,
 
je reviens à la charge avec la compilation de ce projet.
J'ai installé cygwin et je ne parviens toujours pas à compiler avec g++  :cry:
 
g++ main.o sportif.a -o course ne passe pas, des références sont indefinies pour lui alors qu'elles sont dans le .a.  
 
Cygwin n'est pas censé émuler un environnement Unix ?
Je me demande s'il me manque pas des packages ??
 
J'ai installé ELFIO, mais je ne trouve pas de doc sur ce package, ce qu'il fait concrètement et comment on s'en sert.
Auriez vous des idées svp ?


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  DevC++ Compilation projet et options

 

Sujets relatifs
[Débutant] Souci à la compilationpetit projet sur CD
[Pro*C]Se connecter a Oracle avec DevC++une compilation sans erreurs ?
Analyse d'impacts sur un projet C++compilation lente sous Vista avec msys+mingw
[SGBD Access] Projet: Générer des devis, et gestion de stockProblème de MCD pour produits à mulitples options
Compilation avec Dev C++problème de compilation avec la librairie qwt
Plus de sujets relatifs à : DevC++ Compilation projet et options


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR