J'ai jamais vu ca!! (undefined reference) [DJGPP] - Programmation
Marsh Posté le 14-11-2001 à 20:18:02
Essayes en n'écrivant que ça pour le prototype :
void draw_pixel(int, int, char);
Marsh Posté le 14-11-2001 à 22:09:49
Mais quand je change l'extension de mon fichier de cpp vers c la y'a plus d'erreur
Mais moi je veux programmer en C++ pas en C
Marsh Posté le 14-11-2001 à 22:30:59
c original ça alors
et si tu changes des options de compilation ? (genre optimisations, expansion en ligne... .etc...)
Marsh Posté le 14-11-2001 à 22:43:44
Ben j'utilise djgpp et manifestement il décore les noms des fonctions quand il les met dans un fichier obj. Ca doit etre possible de désactiver ca! Ou alors, que le fichier ou on va référencer la fonction soit capable de retrouver la fonction dont le nom est décoré....
Malheureusement y'a aucune option concernant ca
Marsh Posté le 14-11-2001 à 22:44:19
Y'a quand meme bien quelqu'un sur HFR qui compile du code C++ répandu sur plusieurs avec DJGPP quand meme!
Marsh Posté le 15-11-2001 à 00:30:11
si tu veux ke la decoration disparaisse, tu prefixe ta declaration de fonction par un zoli extern "C" (j'espere seulement ke c'est pas du MS specific vu ke sous win, j'utilise ke visual, les makefiles et la ligne de commande ca gonfle profond à la longue)
Exemple:
extern "C"
{
void draw_pixel(int x, int y, char c);
}
Marsh Posté le 15-11-2001 à 10:56:45
oui, le extern "C" marche, mais ça enlève un _ devant. (je faisait ça ozi avec le watcomC pour mes routines en ASM)
Marsh Posté le 15-11-2001 à 13:51:50
Le probleme est ici a mon avis:
>draw_pixel(10, 10, 10);
le compilo c++ en deduit que quelque part, tu vas definir une fonction draw_pixel(int, int, int) et de ce fait, il ne considere pas que ton proto precedent (ni la def de la fonction) correspond a cette fonction, car c'est un draw_pixel(int, int, char).
un draw_pixel(10, 10, (char) 10);
devrait resoudre le pb, non?
Notes que je vois pas a priori ce qui fait que celle qui marchait n' avait pas le meme probleme.
A+,
Marsh Posté le 15-11-2001 à 17:59:49
Ben c pas con, et j'y avais pensé
J'avais meme fait : draw_pixel((int)10, (int)10, (char)10);
ca marche pas non plus
je crois que je vais générer mes fichiers obj avec borland pour ensuite pouvoir les lier avec ld de djgpp (pour générer un fichier binaire)
Marsh Posté le 15-11-2001 à 19:54:42
Ace17 a écrit a écrit : Ben j'utilise djgpp et manifestement il décore les noms des fonctions quand il les met dans un fichier obj. Ca doit etre possible de désactiver ca! Ou alors, que le fichier ou on va référencer la fonction soit capable de retrouver la fonction dont le nom est décoré.... Malheureusement y'a aucune option concernant ca |
Comme tout compilo C++, c'est normal. mais si tous tes .obj ont ete compiles avec le meme compilo, et si ton linker est celui fourni avec ton compilo, ca ne devrait pas poser de probleme.
Par contre, vouloir linker des modules c++ compiles avec des compilos differents, c' est s' exposer aux pires problemes, et je sais de quoi je parle, car je m' escrime a faire ca pour un meme source entre gcc et les compilos natifs a 3 OS Unix (reeussi pour Solaris et HP-UX, ca merde encore pour Aix).
A+,
Marsh Posté le 15-11-2001 à 19:58:58
Notes que ca peut aussi etre un pb avec ta version de gcc, cf le lien suivant: http://archive.linuxfromscratch.or [...] /0798.html
J' ai teste ton source avec le compilo microsoft, il n' y a aucun pb. les deux versions passent sans erreur.
A+,
[edtdd]--Message édité par gilou--[/edtdd]
Marsh Posté le 15-11-2001 à 20:06:38
Au fait,
>int main(void)
mais ta fonction ne retourne pas de valeur.
Ca non plus, un compilo C++ ne devrait pas aimer.
A+,
Marsh Posté le 15-11-2001 à 22:26:33
ouais ouais c'est encore autre chose ca
bon j'ai trouvé la combine : j'utilise le compilo ms et y'a plus de problemes; mais je garde le linker de djgpp
Marsh Posté le 14-11-2001 à 19:01:37
Voici le code source qui marche
void draw_pixel(int x, int y, char c)
{
char* videomem = (char*)0xA0000;
videomem[x+y*320] = c;
}
int main(void)
{
draw_pixel(10, 10, 10);
while(1);
}
Quelqu'un peut me dire pourquoi ce code la ne marche pas?
void draw_pixel(int x, int y, char c);
int main(void)
{
draw_pixel(10, 10, 10);
while(1);
}
void draw_pixel(int x, int y, char c)
{
char* videomem = (char*)0xA0000;
videomem[x+y*320] = c;
}
Le linker me dit :
(.eh_frame+0x11):main.cpp: undefined reference to `___gxx_personality_v0'