2010-10-27 45 views
0

J'ai un petit projet que j'ai besoin de compiler. J'ai un en-tête et une source que j'ai créés et un driver.c presque vide qui inclut mon en-tête.
Observe:Pourquoi plusieurs définitions? Pourquoi les autres références ne sont-elles pas définies? C'est vraiment basique, qu'est-ce qui me manque?

// iol.h 
#ifndef __IOL_HEADER 
#define __IOL_HEADER 
/* program: iol.h 
    date: 5 October 2010 
*/ 

#define UNIX 1 
#define WINDOWS 2 
#define OS UNIX 
#if OS == UNIX 
    #include <ncurses.h> 
#elif OS == WINDOWS 
    #include <conio.h> 
    #include <windows.h> 
// Function declarations! 
#endif 
void iol_init(void); 
#endif 

maintenant mon dossier de mise en œuvre:

// iol.c 
#include <string.h> 
#include <stdlib.h> 
#include "iol.h" 
void iol_init(void) { 
    #if OS == WINDOWS 
     /* no startup required for windows */ 
    #elif OS == UNIX 
     initscr(); 
     noecho(); 
     cbreak(); 
     keypad(stdscr, 1); 
// Implmntn continues.... 

Maintenant, le pilote qui comprend ma tête et fournit la main():

//main.c 
#include "iol.h" 

Ma commande bash:

gcc iol.c driver.c -l"ncurses" 

je reviens:

/tmp/ccmmW6hQ.o:iol.c:(.text+0x83f): first defined here 
/tmp/ccwIKUaT.o: In function 'isEscaping': 
driver.c:(.text+0xbab): multiple definition of 'isEscaping' 
/tmp/ccmmW6hQ.o:iol.c:(.text+0xbab): first defined here 
/tmp/ccwIKUaT.o: In function 'initSeq': 
.. 
driver.c:(.text+0x149): undefined reference to 'iol_prnstr' 
driver.c:(.text+0x178): undefined reference to 'iol_putch' 
.. 
driver.c:(.text+0x726): undefined reference to 'iol_display' 
collect2: ld returned 1 exit status 

Je veux juste aller au point où je peux compiler cela, et commencer à déchirer mes cheveux « cuz de tous mes seg-fautes. Quel est le problème dans ma configuration? Je RTFM sur le compilateur C Gnu apparemment, je fais ce que je suis censé, ce qui est déclare choses dans iol.h, définissent dans iol.c et utilisation dans pilote .c ce sont des choses assez triviales peut-être que j'ai juste besoin d'un deuxième ensemble d'yeux: S
Je reçois effectivement une longue liste d'erreurs, si quelqu'un pense que c'est pertinent, je suis heureux de publier l'ensemble de la source.

+1

Qu'est-ce 'isEscaping'? Qu'est-ce que 'initSeq'? Où sont 'iol_prnstr',' iol_putch' et 'iol_display'? Veuillez envisager de réduire votre code au plus petit exemple possible qui présente toujours le problème. –

+0

ils sont d'autres routines _declared_ dans iol.h et _deefined_ dans iol.c. Ceux-ci ne sont pas vraiment liés à la solution, car ** chaque ** fonction que j'ai écrite jette à la fois une «erreur de référence indéfinie» et une erreur de définition multiple - quelque chose de mal avec le lien ... je sais que je dois lier manuellement dans ncurses, qui est spécifique à ce projet (un éditeur de console multiplateforme) –

+0

Eh bien, pourriez-vous au moins poster des extraits de code qui correspondent aux extraits de votre message d'erreur? –

Répondre

1

c'est l'éditeur de liens qui se plaint. C'est ce que vous obtiendriez si vous aviez une fonction définie dans le fichier d'en-tête qui n'a pas été déclaré « en ligne »

les disparus sont parce que vous n'avez pas ajouté les bonnes bibliothèques

+0

hmmm il verbose me fait savoir s'il ne peut pas trouver une bibliothèque. Si je compile gcc ... -lncurses sans (dans mon cas sur ubuntu de toute façon) libncurses5 le gcc renvoie une invite spécifique me le disant. J'ai essayé gcc ... -lncurses_w, encore une fois en vain, je vais vérifier, mais je ne crois pas que j'ai un problème de liaison dans ncurses mais ... vous ne savez jamais ... –

+0

@Gus: Pourquoi don Ne vous débarrassez-vous pas temporairement de toutes les affaires de ncurses, et réduisez votre problème au cas le plus simple possible? Tout ce truc supplémentaire est juste distrayant ... –

+0

Bon, ben j'ai écrit un programme simple avec une fonction et une main() juste le même modèle que ci-dessus. Aucun problème de lien. Je vais dans mon fichier d'implémentation d'en-tête et ajoute même des appels à ncurses et inclue l'en-tête ... compile à nouveau sans -lncurses, sans surprise, une erreur de lien avec des références non définies aux fonctions ncurses .... recompilées avec -lncurses ... pas de problème. Donc, ma source est pertinente pour la solution en effet ... merci les gars. –

0

Essayez de les compiler séparément:

$ gcc -Wall -c ioi.c 
$ gcc -Wall -c driver.c 
$ gcc ioi.o driver.o -o program -lncurses 

Pour isoler et corriger les erreurs de compilation ...

+0

J'ai essayé cela ... laissez-moi vous donner les résultats ... Belle pensée mais en vain! Chaque commande individuelle de compilation uniquement s'exécute sans erreur. Ajoutant l'interrupteur mural me montre que je suis un peu bâclé: son suggérant je parenthesize mes attributions comme je décide de leur condition, me montre quelques fonctions qui peuvent éventuellement quitter sans retours, et me montrer quelques variables inutilisées ... aucun de ces vont provoquer une erreur de lien, mais pourraient-ils? tels qu'ils provoquent une rupture dans le référencement des fonctions? ou connecter les déclarations avec les définitions? –

0

Vous n'avez pas mentionné si vous compilez sous Windows ou Unix. Si sous Windows je suspecte qu'il y a des dépendances d'ordre dans les fichiers .h. Habituellement, vous voulez d'abord windows.h afin qu'il définisse les constantes que les autres fichiers .h utiliseront.

+0

Je compile pour GCC avec une distribution linux –