Domanda

Ho appena organizzato il mio codice utilizzando le intestazioni, ma proprio come ho fatto questo, ho ricevuto un messaggio di avviso che si trasformò in un errore durante il collegamento.

Ho un codice (utilizzo di una funzione che è all'interno di un'intestazione) in test.c che è così:

#include "test1.h"

/* Some code */
main()
{
   Testing();
}

E la mia intestazione test1.h è come questo:

void Testing();
void print(int, int, int, const char*);

E alla test1.c

void Testing()
{
   print(0xF9, 27, 5, "\xC9\\xBB");
}

void print(int colour, int x, int y, const char *string)
{
   volatile char *video=(volatile char*)0xB8000 + y*160 + x*2;
   while(*string != 0)
   {
      *video=*string;
      string++;
      video++;
      *video=colour;
      video++;
   }
}

Quando provo a compilare il codice, ho ottenuto questo:

  

ubuntu @ EeePC: ~ / Sviluppo / Test $ gcc -o test.o -c test.c -Wall -Wextra -nostdlib -nostartfiles -nodefaultlibs
  test.c: In funzione ‘main’:
  test.c: 11: avvertimento: dichiarazione implicita di funzione
‘Test’   ubuntu @ EeePC: ~ / Sviluppo / Test $

Al momento è solo un semplice avvertimento, ma quando provo a collegarlo ...

  

ubuntu @ EeePC: ~ / Sviluppo / Test $ ld -T linker.ld -o kernel.bin loader.o test.o
  test.o: In funzione main':
test.c:(.text+0xfc): undefined reference to
Testing '

Che cosa devo fare?

È stato utile?

Soluzione

Modifica Per riflettere domanda del PO ho colpito alcune linee della mia risposta, pur essendo upvoted ...

Perché kernel.c contrassegnato nella compilatore, anche se non ce l'hai menzionato qui? Mi sto perdendo qualcosa ...

gcc -o test.o -c test.c -Wall -Wextra -nostdlib -nostartfiles -nodefaultlibs
kernel.c: In function ‘main’:
kernel.c:11: warning: implicit declaration of function ‘Testing’
ubuntu@eeepc:~/Development/Test$

forse avete bisogno di fare in questo modo qualche parte nel file di intestazione come sto giudicando che si desidera kernel per accedere a questa funzione:

extern void Testing();

E, togliere tutte le funzioni e metterli in un file .c a parte, non dovrebbero essere lì, in primo luogo ... per esempio:

Testing.c
/* all your functions here */

Testing.h
/* Only global, external variables and function prototypes */

Spero che questo aiuti, I migliori saluti, Tom.

Altri suggerimenti

Non riesco a ricreare il problema. Questo funziona come previsto quando si tenta di compilare il codice su una macchina Ubuntu (che, sulla base di pasta, presumo che si sta utilizzando.)

Sei sicuro che il # include sta avvenendo correttamente?

Prova a usare -E invece di -c per vedere quello che tutto il codice del compilatore sta cercando di compilare assomiglia.

Un po 'di un salto nel buio qui, dato che il mio C è un po' arrugginito, ma non C permetterà di mettere i corpi di funzione in un colpo di testa? Non ricordo che lo fa. Prova a spostare la definizione di test () e print () in un file .c? Si potrebbe anche provare a compilare come C ++ come vedere se questo risolve, se non avete bisogno / voglia C.

È incluso test.h in main.c, mentre le dichiarazioni, in base a ciò che il vostro scritto, siete in test1.h. Si noti la 1 nel nome.

In aggiunta a ciò, si sta compilando test.c e il collegamento test.o, mentre in realtà il nome del file è test1.c. Anche in questo caso, si noti la 1 nel nome.

Modifica Ora si è modificato il nome del file incluso in main.c. Dopo che la modifica è sicuro di affermare che la maggior parte dei sintomi che descrivono non sono possble con le versioni correnti dei file. Re-verificare cosa si sta facendo, dopo informazioni aggiornate disgnostic e / o CAP reale.

Ancora, si compilatore e linker linee fa riferimento ai nomi di file vecchi.

i Donno cosa è causando questo, ma ho avuto questo problema solo ora. cercare di eliminare il file .h e mettere le dichiarazioni delle funzioni sulla parte superiore del file .c stesso.

In questo caso, eliminare il test1.h e mettere le dichiarazioni di funzioni di test1.c in test1.c. e comprendono test1.c in test.c che si voleva ottenere quel messaggio di avvertimento più, nè i seguenti errori di collegamento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top