[C++] Probleme de Makefile/linkage

Probleme de Makefile/linkage [C++] - C++ - Programmation

Marsh Posté le 19-08-2009 à 15:23:22    

Bonjour,
 
j'essaye d'utiliser la librairie libboard sans succès pour le moment.
 
J'ai correctement installé la libraire et j'ai un bien un fichier dans /usr/lib/libboard.so (et .a).
 
Par contre, je coince sur le makefile, dans mon fichier .c j'ai bien inclus libboard.h et dans le makefile j'ai mis :
xfig.o: xfig.c xfig.h
 $(CC) $(DEBUG) -c xfig.c $(INC) -l libboard
 
malheuresement, j'ai des problèmes du type:
 undefined reference to `LibBoard::Color::None'
 
J'imagine donc qu'il y a un problème de linkage mais je ne comprend pas pourquoi.
 
 
Merci d'avance à ceux qui esseyeront de m'aider, j'imagine que l'erreur est petite mais j'ai pas fait de c++ depuis des années :/

Reply

Marsh Posté le 19-08-2009 à 15:23:22   

Reply

Marsh Posté le 19-08-2009 à 15:27:24    

Essayer en remplaçant  
 
-l libboard  
 
par
 
-l board  
 
La suppression de "lib" date de l'époque où les lignes de commandes ne pouvaient pas avoir beaucoup de caractères. C'est resté, et cela piège tous les pauvres débutants.

Reply

Marsh Posté le 19-08-2009 à 15:30:22    

hum nan toujours le même probleme :/
 
merci!


Message édité par batoub le 19-08-2009 à 15:30:53
Reply

Marsh Posté le 19-08-2009 à 15:37:07    

Je vérifie sur mon exemple qui marche où j'utilise la bibliothèque libjpeg.a, et j'indique -ljpeg
La seule différence c'est que je ne laisse pas d'espace après le -l.
 
Edit: Mais je n'utilise que du C, et pas du C++ qui requiert peut-être quelque chose de plus.


Message édité par olivthill le 19-08-2009 à 15:39:24
Reply

Marsh Posté le 19-08-2009 à 15:42:58    

oué, sans l'espace c'est pareil. :/

Reply

Marsh Posté le 19-08-2009 à 15:45:44    

Si tu -c, alors tu ne link pas, donc ça ne sert à rien ici. c'est à l'assemblage que tu as le problème.
 
-lboard

Reply

Marsh Posté le 19-08-2009 à 15:51:31    

hum, je vais envoyer tout mon makefile ca sera plus simple  
 

Code :
  1. DEBUG= -g -Wall -pedantic -Wno-deprecated
  2. CC=g++
  3. OBJ= xfig.o
  4. INC= -I../planificateur -I../kalman -I../log -I../rrt -I../ann -I../interface_graphique -I.
  5. A=libgarixfig.a
  6. libgarixfig.a: $(OBJ)
  7. rm -f $(A) ../$(A)
  8. ar -ruv $(A) $(OBJ)
  9. cp $(A) ..
  10. xfig.o: xfig.c xfig.h
  11. $(CC) $(DEBUG) -c xfig.c $(INC) -lboard
  12. clean:
  13. rm -f $(OBJ) $(A) ../$(A)

Reply

Marsh Posté le 19-08-2009 à 16:39:24    

Ton .a n'est pas linké par définition. C'est juste une archive de .o.
 
Sur ton assemblage final de tes .o et ton .a, un simple -L. -lboard suffit.

Reply

Marsh Posté le 19-08-2009 à 16:41:21    

c'est nulle part  dans ton makefile que ça foire, puisque:
- ar c'est juste la création de l'archive
- ton CC (qui est g++ en plus ...) ne fait qu'un -c (vire ce -l qui ne sert à rien)

Reply

Marsh Posté le 19-08-2009 à 16:45:10    

$ cat math.c
#include <math.h>
 
double foo(double d)
{
        return sqrt(abs(sin(d)));
}
 
$ gcc -c math.c
$ ar cru libmath.a math.o
$ cat main.c
double foo(double d);
 
int main() {
        foo(3.14);
        return 0;
}
 
$ gcc -c main.c
$ gcc -o foo -L. main.o -lm -lmath
$ nm foo |grep foo
00000000004005a0 T foo

Reply

Marsh Posté le 19-08-2009 à 16:45:10   

Reply

Marsh Posté le 20-08-2009 à 10:29:51    

merci Taz!
 
Effectivement, je mettais mon -lboard au mauvais endroit. J'ai plusieurs makefile "embriqué" et c'est un peu le bazard :)
 
Merci pour ton aide!

Reply

Marsh Posté le 20-08-2009 à 10:48:31    

Attention, pour l'assemblage, l'ordre des arguments est important (toposort, etc).

Reply

Sujets relatifs:

Leave a Replay

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