DevC++ Compilation projet et options

DevC++ Compilation projet et options - C++ - Programmation

Marsh Posté le 22-03-2008 à 00:03:44    

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
Reply

Marsh Posté le 22-03-2008 à 00:03:44   

Reply

Marsh Posté le 22-03-2008 à 00:08:10    

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
Reply

Marsh Posté le 22-03-2008 à 13:53:06    

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
Reply

Marsh Posté le 22-03-2008 à 14:09:42    

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

Reply

Marsh Posté le 23-03-2008 à 11:09:14    

objdump ...

Reply

Marsh Posté le 23-03-2008 à 18:26:18    

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.

Reply

Marsh Posté le 23-03-2008 à 18:34:12    

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.

Reply

Marsh Posté le 23-03-2008 à 20:03:53    

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
Reply

Marsh Posté le 24-03-2008 à 14:18:44    

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
Reply

Marsh Posté le 01-04-2008 à 20:36:03    

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 ?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed