Erreur de Link : Undefined reference to...

Erreur de Link : Undefined reference to... - C - Programmation

Marsh Posté le 02-05-2007 à 10:53:33    

Salut à tous !
 
Je tente désespérément de compiler et linker un programme avec gcc. Je souhaite utiliser la librairie libmad (qui permet de décoder du mpeg), mais j'ai un problème lors de l'édition des liens.
 
Toutes les fonctions de la librairie libmad ne sont pas trouvées, et les erreurs "undefined reference to nom_fonction" apparaissent. J'utilise l'archive libmad.a, et après avoir utilisé la commande nm de mingw, tous les symboles de la librarie apparaissent avec un '_' devant. Par exemple, la fonction "mad_stream_init()" déclarée dans le .h devient _mad_stream_init dans l'archive  :pt1cable: .
 
Se peut-il que le problème d'édition de liens vienne de là, ou alors ça n'a vraiment aucun rapport ?  :??:

Reply

Marsh Posté le 02-05-2007 à 10:53:33   

Reply

Marsh Posté le 02-05-2007 à 11:41:30    

Passe sous windows. De rien.

Reply

Marsh Posté le 02-05-2007 à 12:12:00    

En fait, je suis déjà sous Windows :D
J'utilise devkitPro et mingw pour compiler..
Bon je reconnait que visual c'est plus simple pour mettre en place un projet, mais je n'est pas le choix pour la plateforme de développement :S
 
Merci pour la réponse ;)

Reply

Marsh Posté le 02-05-2007 à 12:14:17    

Je suis ouvert à tout autre suggestion

Reply

Marsh Posté le 02-05-2007 à 18:05:53    

Passe sous Linux.

Reply

Marsh Posté le 02-05-2007 à 18:07:04    

Sérieusement, tu as spécifié les bons -l et -L ?

Reply

Marsh Posté le 02-05-2007 à 18:14:36    

jeriko6911 a écrit :

Passe sous windows. De rien.


 
Fig. 1c : je suis content que Harko t'ait banni.  http://gatsu.ftp.free.fr/smileys/cerveau_hahaguy.gif

Reply

Marsh Posté le 02-05-2007 à 20:07:42    

Oui, Les répertoires sont bien définis avec -L, et les librairies aussi. Pour lier avec l'archive librairie libmad, j'ai juste ajouté -l lmad , ce qui fonctionne avec mingw.

Reply

Marsh Posté le 02-05-2007 à 20:55:49    

Le fichier s'appelle liblmad.so ? (ou .dll en l'occurrence)


Message édité par Elmoricq le 02-05-2007 à 20:56:12
Reply

Marsh Posté le 03-05-2007 à 02:30:02    

non, j'utilise l'archive libmad.a
 
Je viens d'essayer de compiler et de linker, avc gcc, un bout de code (utilisant seulement des fonctions standards et des fonctions de la librairie libmad) utilisant les fonctions de la librairie, et je n'ai pas eu de problème.
 
Le problème viendrai surement du Makefile, que j'utilise pour builder l'ensemble du projet. Pour ceux qui connaissent, J'essai de compiler un homebrew (nom qui fait style pour dire que c'est programme DS) pour Nintendo DS avec devkitPro, la libnds, et la palib.
 
Des projets sont fournis à titres d'exemple, et il n'y a pas de problème lors du build. J'ai complété le makefile d'un projet existant pour linker avec la librairie libmad. Les chemins sont correctement configurés (avec -L) et la librairie est ajoutée avec -lmad (Je me suis planté dans mon précédent poste quand je disais que j'ai ajouté la librairie avec -l lmad).
 
L'erreur provient surement du Makefile, car lors du build, les erreurs qui apparaissent sont les erreurs typiques que l'on a lorsque la librairie n'est pas trouvée.

Reply

Marsh Posté le 03-05-2007 à 02:30:02   

Reply

Marsh Posté le 03-05-2007 à 02:34:02    

Vous voulez peut être voir la tête du Makefile ?

Reply

Marsh Posté le 03-05-2007 à 06:30:53    

Si ton fichier s'appelle "libmad.a", alors il faut écrire "-lmad", et non "-l lmad".

 

edit : j'étais mal réveillé ce matin, tu peux ignorer ce message [:dawa]


Message édité par Elmoricq le 03-05-2007 à 09:26:39
Reply

Marsh Posté le 03-05-2007 à 08:19:33    

Oui montre le makefile, ça peut pas faire de mal.

Reply

Marsh Posté le 03-05-2007 à 10:59:00    

Voila la bête :  
 

Code :
  1. PROGNAME =PAlib
  2. OFILES   +=
  3. ADD_LIBS +=
  4. PATH   := $(DEVKITARM)/bin:$(PATH)
  5. ARM7BIN  := -7 $(PAPATH)/lib/arm7/arm7.bin
  6. TEXT1   := PAlib Project
  7. TEXT2   := using PAlib
  8. TEXT3   := www.palib.info
  9. ICON   := -b $(CURDIR)/../logo.bmp
  10. LOGO  := -o $(CURDIR)/../logo_wifi.bmp
  11. #---------------------------------------------------------------------------------
  12. .SUFFIXES:
  13. #---------------------------------------------------------------------------------
  14. ifeq ($(strip $(DEVKITARM)),)
  15. $(error "Please set DEVKITARM in your environment." export DEVKITARM=<path to>devkitARM)
  16. endif
  17. include $(DEVKITARM)/ds_rules
  18. #---------------------------------------------------------------------------------
  19. # TARGET is the name of the output, if this ends with _mb generates a multiboot image
  20. # BUILD is the directory where object files & intermediate files will be placed
  21. # SOURCES is a list of directories containing source code
  22. # INCLUDES is a list of directories containing extra header files
  23. #---------------------------------------------------------------------------------
  24. TARGET := $(shell basename $(CURDIR))
  25. BUILD  := build
  26. SOURCES := gfx source data
  27. INCLUDES := include build data
  28. EXPORT_DIR := /c/ndsexamples/
  29. #---------------------------------------------------------------------------------
  30. # ARM7BIN is the path to an arm7 binary other than the default
  31. # usage: ARM7BIN := -7 binaryName.bin
  32. #
  33. # ICON is the path to an icon to be used int the header plus text
  34. # usage: ICON := -t iconName.bmp "text line one; text line 2; text line 3"
  35. #
  36. #---------------------------------------------------------------------------------
  37. #---------------------------------------------------------------------------------
  38. # options for code generation
  39. #---------------------------------------------------------------------------------
  40. ARCH := -mthumb-interwork
  41. # note: arm9tdmi isn't the correct CPU arch, but anything newer and LD
  42. # *insists* it has a FPU or VFP, and it won't take no for an answer!
  43. CFLAGS := -g  -Wformat=2 -Winline -Wall -O2\
  44.   -mcpu=arm946e-s -mtune=arm946e-s -fomit-frame-pointer\
  45.  -ffast-math \
  46.  $(ARCH)
  47. CFLAGS += $(INCLUDE) -DARM9 -I$(DEVKITPRO)/PAlib/include/nds -I$(DEVKITARM)/include
  48. ASFLAGS := -g $(ARCH)
  49. LDFLAGS := -g $(ARCH) -mno-fpu -L$(DEVKITPRO)/PAlib/lib -L$(DEVKITARM)/lib
  50. #---------------------------------------------------------------------------------
  51. # path to tools - this can be deleted if you set the path in windows
  52. #---------------------------------------------------------------------------------
  53. # export PATH  := /d/dev/ds/devkitARM_r11/bin:/bin
  54. #---------------------------------------------------------------------------------
  55. # PATH to ndslib - just make a system variable called NDSLIBPATH and be done with it
  56. #---------------------------------------------------------------------------------
  57. # NDSLIBPATH := /d/dev/ds/ndslib/
  58. #---------------------------------------------------------------------------------
  59. # the prefix on the compiler executables
  60. #---------------------------------------------------------------------------------
  61. PREFIX   := arm-eabi-
  62. #---------------------------------------------------------------------------------
  63. # any extra libraries we wish to link with the project
  64. #---------------------------------------------------------------------------------
  65. LIBS := -lfat -lnds9 -ldswifi9
  66. LIBSPA := -lpa9
  67. LIBSMAD := -lmad
  68. #---------------------------------------------------------------------------------
  69. # list of directories containing libraries, this must be the top level containing
  70. # include and lib
  71. #---------------------------------------------------------------------------------
  72. LIBDIRS := $(DEVKITPRO)/libnds
  73. LIBDIRPA := $(PAPATH)
  74. LIBDIRMAD := $(DEVKITPRO)/libmad
  75. #---------------------------------------------------------------------------------
  76. # no real need to edit anything past this point unless you need to add additional
  77. # rules for different file extensions
  78. #---------------------------------------------------------------------------------
  79. ifneq ($(BUILD),$(notdir $(CURDIR)))
  80. #---------------------------------------------------------------------------------
  81. export OUTPUT := $(CURDIR)/$(TARGET)
  82. export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir))
  83. export CC  := $(PREFIX)gcc
  84. export CXX  := $(PREFIX)g++
  85. export AR  := $(PREFIX)ar
  86. export OBJCOPY := $(PREFIX)objcopy
  87. #---------------------------------------------------------------------------------
  88. # use CXX for linking C++ projects, CC for standard C
  89. #---------------------------------------------------------------------------------
  90. #export LD  := $(CXX)
  91. export LD  := $(CC)
  92. CFILES  := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c)))
  93. CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp)))
  94. SFILES  := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s)))
  95. PCXFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.pcx)))
  96. BINFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.bin)))
  97. PALFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.pal)))
  98. RAWFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.raw)))
  99. MAPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.map)))
  100. JPEGFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.jpg)))
  101. MODFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.mod)))
  102. GIFFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.gif)))
  103. BMPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.bmp)))
  104.  
  105. export OFILES := $(MAPFILES:.map=.o) $(RAWFILES:.raw=.o) $(PALFILES:.pal=.o) $(BINFILES:.bin=.o) $(PCXFILES:.pcx=.o) $(JPEGFILES:.jpg=.o) $(MODFILES:.mod=.o) $(GIFFILES:.gif=.o) $(BMPFILES:.bmp=.o)\
  106.     $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o)
  107.  
  108. export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \
  109.     $(foreach dir,$(LIBDIRS),-I$(dir)/include) \
  110.     $(foreach dir,$(LIBDIRS),-I$(dir)/include/nds) \
  111.     $(foreach dir,$(LIBDIRMAD),-I$(dir)/include) \
  112.     -I$(PAPATH)/include/nds\
  113.     -I$(CURDIR)/$(BUILD)
  114.  
  115. export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib)
  116. export LIBPATHPA := $(foreach dir,$(LIBDIRPA),-L$(dir)/lib)
  117. export LIBPATHMAD := $(foreach dir,$(LIBDIRMAD),-L$(dir)/lib)
  118.  
  119. .PHONY: $(BUILD) clean export
  120.  
  121. #---------------------------------------------------------------------------------
  122. $(BUILD):
  123. @[ -d $@ ] || mkdir -p $@
  124. @make --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile
  125.  
  126. #---------------------------------------------------------------------------------
  127. clean:
  128. @echo clean ...$(TARGET)
  129. @rm -fr $(BUILD) *.elf *.*ds*
  130.  
  131. export:
  132. @echo exporting ...$(TARGET)
  133. @cp *.nds $(EXPORT_DIR)/$(TARGET).nds
  134. #---------------------------------------------------------------------------------
  135. else
  136.  
  137. DEPENDS := $(OFILES:.o=.d)
  138.  
  139. #---------------------------------------------------------------------------------
  140. # main targets
  141. #---------------------------------------------------------------------------------
  142. $(OUTPUT).ds.gba :  $(OUTPUT).nds
  143. $(OUTPUT).nds :  $(OUTPUT).bin
  144. $(OUTPUT).bin : $(OUTPUT).elf
  145.  
  146. $(OUTPUT).elf : $(OFILES)
  147.  
  148. #---------------------------------------------------------------------------------
  149. %.ds.gba: %.nds
  150. @echo built ... $(notdir $@)
  151. @dsbuild $<  
  152. @cp $(CURDIR)/../$(notdir $@) ../$(notdir $(OUTPUT)).sc.nds  
  153. #---------------------------------------------------------------------------------
  154. %.nds: %.bin
  155.  
  156. @ndstool -c $@ -9 $(TARGET).bin $(ARM7BIN) $(LOGO) $(ICON) "$(TEXT1);$(TEXT2);$(TEXT3)"
  157. #---------------------------------------------------------------------------------
  158. %.bin: %.elf
  159.  
  160. @$(OBJCOPY) -O binary $(TARGET).elf $(TARGET).bin
  161.  
  162. #---------------------------------------------------------------------------------
  163. %.elf:
  164. @echo $(LD)  $(LDFLAGS) -specs=ds_arm9.specs $(OFILES) $(LIBPATHMAD) $(LIBSMAD) $(LIBPATHPA) $(LIBSPA) $(LIBPATHS) $(LIBS) -o $(TARGET).elf
  165. @$(LD)  $(LDFLAGS) -specs=ds_arm9.specs $(OFILES) $(LIBPATHMAD) $(LIBSMAD) $(LIBPATHPA) $(LIBSPA) $(LIBPATHS) $(LIBS) -o $(TARGET).elf
  166.  
  167.  
  168.  
  169. #---------------------------------------------------------------------------------
  170. # Compile Targets for C/C++
  171. #---------------------------------------------------------------------------------
  172.  
  173. #---------------------------------------------------------------------------------
  174. %.o : %.cpp
  175. @echo $(notdir $< )
  176. @$(CXX) -MM $(CFLAGS) -o $*.d $<
  177. @$(CXX) $(CFLAGS) -c $< -o$@
  178.  
  179. #---------------------------------------------------------------------------------
  180. %.o : %.c
  181. @echo $(notdir $< )
  182. @$(CC) -MM $(CFLAGS) -o $*.d $<
  183. @$(CC)  $(CFLAGS) -c $< -o$@
  184.  
  185. #---------------------------------------------------------------------------------
  186. %.o : %.s
  187. @echo $(notdir $< )
  188. @$(CC) -MM $(CFLAGS) -o $*.d $<
  189. @$(CC)  $(ASFLAGS) -c $< -o$@
  190.  
  191. define bin2o
  192. cp $(< ) $(*).tmp
  193. echo -n $$(( `cat $(*).tmp | wc -c` & 3 )) | sed -e 's/0//g' | sed -e 's/1/000/g' | sed -e 's/2/00/g' | sed -e 's/3/0/g' >> $(*).tmp
  194. $(OBJCOPY) -I binary -O elf32-littlearm -B arm \
  195. --rename-section .data=.rodata \
  196. --redefine-sym _binary_$*_tmp_start=$*\
  197. --redefine-sym _binary_$*_tmp_end=$*_end\
  198. --redefine-sym _binary_$*_tmp_size=$*_size\
  199. $(*).tmp $(@)  
  200. echo "extern const u8" $(*)"[];" > $(*).h
  201. echo "extern const u32" $(*)_size[]";" >> $(*).h
  202. rm $(*).tmp
  203. endef
  204.  
  205. #---------------------------------------------------------------------------------
  206. %.o : %.pcx
  207. #---------------------------------------------------------------------------------
  208. @echo $(notdir $< )
  209. @$(bin2o)
  210.  
  211. #---------------------------------------------------------------------------------
  212. %.o : %.bin
  213. #---------------------------------------------------------------------------------
  214. @echo $(notdir $< )
  215. @$(bin2o)
  216.  
  217. #---------------------------------------------------------------------------------
  218. %.o : %.raw
  219. #---------------------------------------------------------------------------------
  220. @echo $(notdir $< )
  221. @$(bin2o)
  222.  
  223. #---------------------------------------------------------------------------------
  224. %.o : %.pal
  225. #---------------------------------------------------------------------------------
  226. @echo $(notdir $< )
  227. @$(bin2o)
  228.  
  229. #---------------------------------------------------------------------------------
  230. %.o : %.map
  231. #---------------------------------------------------------------------------------
  232. @echo $(notdir $< )
  233. @$(bin2o)
  234. #---------------------------------------------------------------------------------
  235. %.o : %.mdl
  236. #---------------------------------------------------------------------------------
  237. @echo $(notdir $< )
  238. @$(bin2o)
  239. #---------------------------------------------------------------------------------
  240. %.o : %.jpg
  241. #---------------------------------------------------------------------------------
  242. @echo $(notdir $< )
  243. @$(bin2o)
  244. #---------------------------------------------------------------------------------
  245. %.o : %.mod
  246. #---------------------------------------------------------------------------------
  247. @echo $(notdir $< )
  248. @$(bin2o)
  249. #---------------------------------------------------------------------------------
  250. %.o : %.gif
  251. #---------------------------------------------------------------------------------
  252. @echo $(notdir $< )
  253. @$(bin2o)
  254. #---------------------------------------------------------------------------------
  255. %.o : %.bmp
  256. #---------------------------------------------------------------------------------
  257. @echo $(notdir $< )
  258. @$(bin2o)
  259.  
  260. -include $(DEPENDS)  
  261. #---------------------------------------------------------------------------------------
  262. endif
  263. #---------------------------------------------------------------------------------------


 
J'ai seulement ajouté dans le makefile, les "variables" (je sais pas si on appelle ça comme ça pour un makefile) :
LIBSMAD, LIBDIRMAD, et LIBPATHMAD
En gros j'ai fait la meme chose que pour les variables LIBS, LIBDIRS, LIBPATHS, LIBPA, LIBDIRPA, et LIBPATHPA qui étaient déjà présentes.
 
J'ai ensuite ajouté les variables LIBSMAD et LIBPATHMAD dans la ligne de build
 
@$(LD)  $(LDFLAGS) -specs=ds_arm9.specs $(OFILES) $(LIBPATHMAD) $(LIBSMAD) $(LIBPATHPA) $(LIBSPA) $(LIBPATHS) $(LIBS) -o $(TARGET).elf
 
Pour information, voici ce que j'obtiens lorsque le build échoue  
 

Code :
  1. bstdfile.c
  2. main.c
  3. c:/Homebrews/TestRaw2/source/main.c:17:31: warning: backslash and newline separated by space
  4. c:/Homebrews/TestRaw2/source/main.c:18:29: warning: backslash and newline separated by space
  5. c:/Homebrews/TestRaw2/source/main.c:19:31: warning: backslash and newline separated by space
  6. c:/Homebrews/TestRaw2/source/main.c:20:29: warning: backslash and newline separated by space
  7. c:/Homebrews/TestRaw2/source/main.c:177:33: warning: backslash and newline separated by space
  8. c:/Homebrews/TestRaw2/source/main.c: In function 'MpegAudioDecoder':
  9. c:/Homebrews/TestRaw2/source/main.c:235: warning: unused variable 'i'
  10. c:/Homebrews/TestRaw2/source/main.c:234: warning: unused variable 'OutputBufferEnd'
  11. c:/Homebrews/TestRaw2/source/main.c:231: warning: unused variable 'OutputPtr'
  12. c:/Homebrews/TestRaw2/source/main.c: At top level:
  13. c:/Homebrews/TestRaw2/source/main.c:104: warning: 'MadFixedToSshort' defined but not used
  14. c:/Homebrews/TestRaw2/source/main.c:202: warning: 'ApplyFilter' defined but not used
  15. c:/Homebrews/TestRaw2/source/main.c: In function 'main':
  16. c:/Homebrews/TestRaw2/source/main.c:455: warning: 'num' is used uninitialized in this function
  17. arm-eabi-gcc -g -mthumb-interwork -mno-fpu -L/c/devkitPro/PAlib/lib -L/c/devkitPro/devkitARM/lib -specs=ds_arm9.specs bstdfile.o main.o -L/c/devkitPro/libmad/lib -lmad -L/c/devkitPro/PAlib/lib -lpa9 -L/c/devkitPro/libnds/lib -lfat -lnds9 -ldswifi9 -o build.elf
  18. main.o: In function `MpegAudioDecoder':
  19. c:/Homebrews/TestRaw2/source/main.c:239: undefined reference to `mad_stream_init'
  20. c:/Homebrews/TestRaw2/source/main.c:240: undefined reference to `mad_frame_init'
  21. c:/Homebrews/TestRaw2/source/main.c:241: undefined reference to `mad_synth_init'
  22. c:/Homebrews/TestRaw2/source/main.c:301: undefined reference to `mad_frame_decode'
  23. c:/Homebrews/TestRaw2/source/main.c:308: undefined reference to `mad_stream_errorstr'
  24. c:/Homebrews/TestRaw2/source/main.c:318: undefined reference to `mad_stream_errorstr'
  25. c:/Homebrews/TestRaw2/source/main.c:293: undefined reference to `mad_stream_buffer'
  26. c:/Homebrews/TestRaw2/source/main.c:391: undefined reference to `mad_frame_finish'
  27. c:/Homebrews/TestRaw2/source/main.c:392: undefined reference to `mad_stream_finish'
  28. collect2: ld returned 1 exit status
  29. make[1]: *** [/c/Homebrews/TestRaw2/TestRaw2.elf] Error 1
  30. make: *** [build] Error 2


Reply

Marsh Posté le 04-05-2007 à 13:26:57    

Il n"y pas un (ou une) spécialiste du makefile dans le coin ?

Reply

Marsh Posté le 09-05-2007 à 16:48:59    

Bon...
J'ai pu enlevé les underscore devant les noms de sympboles. Pour chaque fichier objet, il faut utiliser la commande  
objcopy --remove-leading-char fichier.o
Après l'avoir fait pour chaque fichier objet de la librairie, on refait l'archive avec la commande ar, et puis voilou, on se retrouve avec les noms de symboles "corrects".
 
c plutôt cool, mais le problême ne venait pas de là :)  
 
Avant de faire ça, j'ai tenté d'utiliser la commande objcopy directement sur la librairie libmad.a. ça a fait n'importe quoi, car à l'édition des liens, il y a eu une erreur signalant que la librairie libmad.a avait un format inconnu...  
Cela montre que à l'édition des liens, il va chercher la bonne librairie. Alors pourquoi, si le nom des symboles est maintenant correct, il y a toujours des erreurs de "undefined reference to ..." pendant l'édition de liens ???

Reply

Sujets relatifs:

Leave a Replay

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