Compilo et header files

Compilo et header files - C - Programmation

Marsh Posté le 10-11-2013 à 19:20:04    

Hello
 
Dites j'ai un problème avec ce langage archaïque qu'est le C  :fou: . :o
Bon je ne suis pas doué non plus cela dit :o
 
Bref le compilo, semble avoir du mal à trouver des fonctions pourtant bien définies.
 
En gros c'est simple.
Dans mon main.c j'utilise une lib quelconque.
 
Dans ce main.c j'ai donc un #include malib_config.h, ce même fichier se trouve dans le même dossier que le main.c.
Le header malib_config.h contient: #include "monDossier/ma_lib.h".
Ce header ma_lib.h contient: #include "dossierXYZ/xyz.h"
 
C'est dans ce header xyz que mes fonctions sont définies.
 
Or le compilo me pond une erreur dans le main.c, il ne semble pas trouver les fonctions qui existent bien dans ce xyz.h.
 
 
Bref il y a un truc que j'ai pas capté avec les header files en C/C++.
 
Eclipse lui s'y retrouve très bien, CTRL + click sur le nom de la fonction et il m'ouvre son implémentation. Le compilo lui fait la gueule.
 
Une aide?
Merci :jap:


Message édité par Profil supprimé le 10-11-2013 à 19:33:27
Reply

Marsh Posté le 10-11-2013 à 19:20:04   

Reply

Marsh Posté le 10-11-2013 à 20:02:47    

Faudrait voir les fichiers main.c et xyz.h :jap:


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 10-11-2013 à 20:11:33    

J'ai pas le droit de la mettre en ligne.
 
C'est la lib cryptographic pour STM32 de ST Micro.


Message édité par Profil supprimé le 10-11-2013 à 20:11:48
Reply

Marsh Posté le 10-11-2013 à 20:16:27    

C'est quoi exactement le message d'erreur ?
C'est à la compile ou au link ?

Reply

Marsh Posté le 10-11-2013 à 20:21:32    

A la compilation.

Citation :

undefined reference to `AES_CTR_Encrypt_Init'
undefined reference to `AES_CTR_Encrypt_Append'
undefined reference to `AES_CTR_Encrypt_Finish'
.....


Compilo:
GNU toolchain for ARM

Message cité 1 fois
Message édité par Profil supprimé le 10-11-2013 à 20:21:58
Reply

Marsh Posté le 10-11-2013 à 20:26:58    

Il manque des link.
 
Tu devrais avoir un fichier du genre libtralala.a (à placer dans le dossier lib du compilo, ou rajouter la dir à la main)
 
Si tu fais ton makefile toi-même :  
 
-L"LeCheminVersTaLib"
-ltralala (en admettant que ta lib s'appelle libtralala.a)
 
Sinon, faut voir selon l'IDE.
 
Après, si t'es pas avec une librairie externe, dans ce cas c'est que tu as un fichier *.c pas compilé.


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 10-11-2013 à 20:45:55    


 
Ca ressemble plutot à une erreur de link (et pas de compilation).
Comme dit au dessus il doit manquer les chemins des libs.
 

Reply

Marsh Posté le 11-11-2013 à 11:23:32    

Merci pour vos réponses.

Reply

Marsh Posté le 11-11-2013 à 12:37:49    

En fait je me rends compte qu'il n'y a que les prototypes des fonctions de définis, pas leur implémentations.
C'est quoi que cette lib  :heink:

 

Par contre quand j'ouvre le projet avec IAR Workbench (pour lequel un fichier project/workspace est fourni avec la lib), ca compile sans broncher.


Message édité par Profil supprimé le 11-11-2013 à 12:38:06
Reply

Marsh Posté le 11-11-2013 à 12:56:07    

Je viens de rajouter la commande -I.... comme vous me l'avez conseillé, et en effet je n'ai plus besoin d'utiliser le chemin complet vers le header file quand j'inclus dans un autre fichier, en gros le compilo sait les retrouver.
 
Par contre j'ai toujours ces undefined reference to :/
 
Je sais pas où elles sont implémentées ces fonctions :heink:, en principe c'est une demo toute fait, il y a qu'à compiler et c'est fait d'après la doc, pas besoin d'implémenter nous même ces fonctions prototype (encore heureux j'ai aucune idée de ce qu'elles doivent faire).


Message édité par Profil supprimé le 11-11-2013 à 12:57:44
Reply

Marsh Posté le 11-11-2013 à 12:56:07   

Reply

Marsh Posté le 11-11-2013 à 13:02:41    

Donc il faut linker la lib.
Tu devrais avoir un fichier libxxx.a qui traîne quelque part, cherche-le et link-le (-lxxx ) :jap:


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 11-11-2013 à 13:19:27    

Oui en effet j'ai un xyz.a dans un dossier Binary/EWARM (pour IAR Workbench donc) et un fichier xyz.lib dans un dossier Binary/MK-ARM (pour Keil MDK donc).
Par contre le fichier n'apas de préfixe "lib", ca ne posera pas problème?
 
 
Je vais essayer de voir comment on inclut la commande dans le makefile existant. Je suis obligé d'utiliser celui de ChibiOS, et c'est la jungle :pt1cable:


Message édité par Profil supprimé le 11-11-2013 à 13:20:08
Reply

Marsh Posté le 11-11-2013 à 13:36:46    

Maintenant j'ai une avalanche d'erreurs au niveau de la lib elle même: undefined reference to `__aeabi_memcpy'....
 
J'imagine que la lib crypto a besoin d'une autre lib annexe que je dois charger avant?  :pt1cable:
 
 
EDIT:
mmh, ou plutôt ca n'aime pas le compilo GNU gcc arm :/, ce qui explique pourquoi il y a des fichiers lib différents en fonction du compilo/environnement de dev. :(
 
Si j'utilise l'autre fichier .lib ca me donne un hidden symbol `__aeabi_memcpy' isn't defined


Message édité par Profil supprimé le 11-11-2013 à 13:45:15
Reply

Marsh Posté le 11-11-2013 à 13:51:15    

Il me semble que les fichiers *.lib c'est les librairies pour Windows, donc avec un compilateur de chez Microsoft.
 
Le fichier *.a devrait faire l'affaire, après j'ai jamais dev avec GCC Arm3.
 
Tu as une idée du compilateur utilisé pour les sources de test ?


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 11-11-2013 à 14:01:09    

J'ai pas trouvé cette info dans la doc, mais je dirais que le *.a est compilé par le compilo propriétaire d'IAR Workbench et le *.lib par celui de Keil.
Vive la jungle des compilo et leur implémentation différente :/.
 
Décidément faut un BAC+5 spécialisation système embarqué pour s'y retrouver dans ce bazar :/.
C'est pourtant simple ce que je veux développer et pourtant je perds 99% du temps à configurer ou a essayer de comprendre environnement de dev.
 
Bon ben je vais aller faire un tour sur le forum de ST.
 
 
En tout cas merci pour ton aide, ca m'a quand même permis d'avancer un peu vers la solution :jap:


Message édité par Profil supprimé le 11-11-2013 à 14:02:56
Reply

Marsh Posté le 12-11-2013 à 11:45:46    

Un utilisteur sur le forum ST m'a donné un shim pour rendre la lib compatible avec gcc.  
Ca compile maintenant.
 
:jap:

Reply

Marsh Posté le 22-11-2013 à 13:44:55    

Hello  
 
Encore moi, alors ca ne concerne pas la lib dont on a parlé plus haut, mais j'ai denouveau le même genre de problème de undefined reference to :(
 
Sauf que la je ne vois absolument pas d'où vient l'erreur. Pourtant c'est tout simple.
J'ai un sous-dossier Eeprom qui contient des headers, source et makefile.
http://img4.hostingpics.net/pics/176227sdfgdagsdg.png
 
Le eeprom.mk il est inclut dans le makefile principal et est correctement configuré.
http://img4.hostingpics.net/pics/751031safsadf.png
 
Dans eeprom_testsuite.c je fais appel à des fonctions définies dans eeprom_i2c.h/eeprom_i2c.c
Le fichier eeprom_testsuite.c inclut le header hal.h qui lui même inclut eeprom_i2c.h
 
Je précise que EEPROMINC est placé au bon endroit dans le makefile, car si je mets un chemin quelconque c'est hal.h qui gueule, donc c'est que le chemin doit être ok.
Pour le EEPROMSRC, il est ok aussi vu que les fichiers .o sont bien générés.
 
Et pourtant ca me pond un undefined reference to  [:fegafobobos:2]
 
Help please :(


Message édité par Profil supprimé le 22-11-2013 à 13:49:12
Reply

Marsh Posté le 22-11-2013 à 15:27:19    

Bon finalement il s'avère que c'est ca qui pose problème :D
 

Code :
  1. #ifndef _EEPROM_I2C_H_
  2. #define _EEPROM_I2C_H_


 
En gros le contenu du header n'était pas lu à cause de cette condition.

Message cité 1 fois
Message édité par Profil supprimé le 22-11-2013 à 15:44:24
Reply

Marsh Posté le 22-11-2013 à 15:41:19    


 
C'est une protection contre les inclusions multiples, il faut surtout pas l'enlever.
 

Reply

Marsh Posté le 22-11-2013 à 15:50:16    

Ah c'est donc ca. Je le rajouterai plus tard quand je me serai débarrasser des autres problèmes alors :jap:

 

En l'occurrence ca  [:tinostar] :

Code :
  1. EEPROMConfig eepromcfg1 = {
  2.   &I2CD1,
  3.   &i2ccfg1,
  4.   0x50,
  5.   PAGE_SIZE,
  6.   BLOCK_SIZE,
  7.   MS2ST(10),
  8.   FALSE,
  9.   FALSE
  10. };


unknown type name 'EEPROMConfig'
 :fou:

 

Si je rajoute "struct" devant comme je l'ai fait pour l'autre structure, j'ai ca comme erreur:
variable 'eepromcfg1' has initializer but incomplete type

 

[:k o k i a:3]

Message cité 1 fois
Message édité par Profil supprimé le 22-11-2013 à 15:51:28
Reply

Marsh Posté le 22-11-2013 à 19:54:08    


 
Je te conseille plutôt de remettre la protection et de chercher à corriger les problèmes qui en découlent.
 

Reply

Marsh Posté le 22-11-2013 à 20:04:03    

Ben oui mais avec des protections j'ai l'impression que le header n'est absolument pas pris en compte, alors que j'ai bien ces includes dans l'eeprom_testsuite.c

 
Code :
  1. #include "eeprom_i2c.h"
  2. #include "eeprom_testsuite.h"
 
Citation :

eeprom_testsuite.c:134: undefined reference to `eepromObjectInit'
eeprom_testsuite.c:135: undefined reference to `eepromStart'

 

Je désespère :/

 

C'est complètement barge ce truc.

 

Si je mets le #include "eeprom_i2c.h", il rale parce qu'il n'a pas de référence à ces fonctions (alors qu'elles y sont).
Si j'enlève cet #include "eeprom_i2c.h", il rale parce qu'il ne connait pas ces noms de fonctions.

 

Donc c'est qu'il doit bien remarquer la présence de ce header, pourquoi ne trouve-t-il pas les prototypes de fonctions qui y sont définis???

Message cité 1 fois
Message édité par Profil supprimé le 22-11-2013 à 20:15:49
Reply

Marsh Posté le 22-11-2013 à 20:25:39    


 
 
S'il est pas pris en compte c'est qu'il a déjà été inclus (directement ou indirectement), c'est justement le but de la protection contre les inclusions multiples.
 
Ton problème de undefined reference c'est plutôt un problème d'édition de liens (lib qui manque ou .o qui manque).

Reply

Marsh Posté le 22-11-2013 à 20:32:05    

Mais les fichiers .o sont bien là :/
 
http://img11.hostingpics.net/pics/463442dzutzujrtut.png
 
 

Reply

Marsh Posté le 22-11-2013 à 20:56:34    


Ils sont bien linkés (vérifie dans ton makefile) ?

Reply

Marsh Posté le 22-11-2013 à 21:56:46    

Ben dans le makefile de la lib il y a ca:
http://img4.hostingpics.net/pics/751031safsadf.png
 
Dans le makefile principal qui fait appel au makefile de la lib j'ai rajouté les 2 variables.
 
$(EEPROMSRC)

Code :
  1. # C sources that can be compiled in ARM or THUMB mode depending on the global
  2. # setting.
  3. CSRC = $(PORTSRC) \
  4.        $(KERNSRC) \
  5.        $(HALSRC) \
  6.        $(PLATFORMSRC) \
  7.        $(BOARDSRC) \
  8.        $(GFXSRC) \
  9.        $(FATFSSRC) \
  10.        $(TESTSRC) \
  11.        $(CHIBIOS)/os/various/evtimer.c \
  12.        $(CHIBIOS)/os/various/shell.c \
  13.        $(CHIBIOS)/os/various/chprintf.c \
  14.        STM32F4xx_StdPeriph_Driver/src/stm32f4xx_rcc.c   \
  15.        STM32F4xx_StdPeriph_Driver/src/stm32f4xx_rng.c   \
  16.        $(EEPROMSRC) \
  17.        usbcfg.c main.c


 
$(EEPROMINC) pour les headers:

Code :
  1. INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \
  2.          $(HALINC) $(PLATFORMINC) $(BOARDINC) \
  3.          $(GFXINC) \
  4.          $(FATFSINC) \
  5.          $(CHIBIOS)/os/various \
  6.          ./CMSIS/Device/ST/STM32F4xx/Include \
  7.          ./STM32F4xx_StdPeriph_Driver/inc   \
  8.          ./STM32_Cryptographic_Library/inc  \
  9.          $(EEPROMINC)


 
Quand je vois le reste j'ai l'impression que c'est comme ca qu'il faut faire  :??:


Message édité par Profil supprimé le 22-11-2013 à 21:58:34
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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