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

  FORUM HardWare.fr
  Programmation
  C

  Compilo et header files

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Compilo et header files

n°2209867
Profil sup​primé
Posté le 10-11-2013 à 19:20:04  answer
 

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
mood
Publicité
Posté le 10-11-2013 à 19:20:04  profilanswer
 

n°2209868
Terminapor
I'll see you rise.
Posté le 10-11-2013 à 20:02:47  profilanswer
 

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


---------------
Perhaps you don't deserve to breathe
n°2209869
Profil sup​primé
Posté le 10-11-2013 à 20:11:33  answer
 

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
n°2209870
Totoche17
Posté le 10-11-2013 à 20:16:27  profilanswer
 

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

n°2209872
Profil sup​primé
Posté le 10-11-2013 à 20:21:32  answer
 

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
n°2209873
Terminapor
I'll see you rise.
Posté le 10-11-2013 à 20:26:58  profilanswer
 

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
n°2209875
Totoche17
Posté le 10-11-2013 à 20:45:55  profilanswer
 


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

n°2209898
Profil sup​primé
Posté le 11-11-2013 à 11:23:32  answer
 

Merci pour vos réponses.

n°2209904
Profil sup​primé
Posté le 11-11-2013 à 12:37:49  answer
 

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
n°2209907
Profil sup​primé
Posté le 11-11-2013 à 12:56:07  answer
 

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
mood
Publicité
Posté le 11-11-2013 à 12:56:07  profilanswer
 

n°2209908
Terminapor
I'll see you rise.
Posté le 11-11-2013 à 13:02:41  profilanswer
 

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
n°2209909
Profil sup​primé
Posté le 11-11-2013 à 13:19:27  answer
 

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
n°2209911
Profil sup​primé
Posté le 11-11-2013 à 13:36:46  answer
 

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
n°2209912
Terminapor
I'll see you rise.
Posté le 11-11-2013 à 13:51:15  profilanswer
 

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
n°2209914
Profil sup​primé
Posté le 11-11-2013 à 14:01:09  answer
 

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
n°2209972
Profil sup​primé
Posté le 12-11-2013 à 11:45:46  answer
 

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

n°2211342
Profil sup​primé
Posté le 22-11-2013 à 13:44:55  answer
 

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
n°2211373
Profil sup​primé
Posté le 22-11-2013 à 15:27:19  answer
 

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
n°2211381
Totoche17
Posté le 22-11-2013 à 15:41:19  profilanswer
 


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

n°2211384
Profil sup​primé
Posté le 22-11-2013 à 15:50:16  answer
 

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
n°2211414
Totoche17
Posté le 22-11-2013 à 19:54:08  profilanswer
 


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

n°2211415
Profil sup​primé
Posté le 22-11-2013 à 20:04:03  answer
 

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
n°2211416
Totoche17
Posté le 22-11-2013 à 20:25:39  profilanswer
 


 
 
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).

n°2211417
Profil sup​primé
Posté le 22-11-2013 à 20:32:05  answer
 

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

n°2211419
Totoche17
Posté le 22-11-2013 à 20:56:34  profilanswer
 


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

n°2211423
Profil sup​primé
Posté le 22-11-2013 à 21:56:46  answer
 

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
mood
Publicité
Posté le   profilanswer
 


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

  Compilo et header files

 

Sujets relatifs
Aide: Mise en Page "header" et redimensionnementCannot modify header information - headers already sent
Upload files phpnav déclaré dans header s'affiche en dehors...
Problème pour faire liaison entre main.c et header.hHeader Content Footer en Css
Un espace entre ma page et mon header : comment le virer ?commnt supprimer les Temporary Internet Files
Problème image d'un header qui se décale sous IEProblème étrange d'inclusion de header
Plus de sujets relatifs à : Compilo et header files


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