Pregunta

acabo organizado mi código mediante el uso de cabeceras, pero al igual que lo he hecho, tengo una advertencia de que se convirtió en un error al vincular.

Tengo un código (uso de una función que está dentro de una cabecera) en test.c que es de esta manera:

#include "test1.h"

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

Y mi cabecera test1.h es la siguiente:

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

Y en 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++;
   }
}

Cuando intento compilar el código, tengo esto:

  

ubuntu @ EeePC: ~ / Desarrollo / prueba $ gcc -o test.o -c test.c -Wall -Wextra -nostdlib -nostartfiles -nodefaultlibs
  test.c: En la función ‘main’:
  test.c: 11: aviso: declaración implícita de la función de búsqueda: ‘Prueba’   ubuntu @ EeePC: ~ / Desarrollo / prueba $

En el momento es sólo una simple advertencia, pero cuando trato de vincularlo ...

  

ubuntu @ EeePC: ~ / Desarrollo / prueba $ ld -T linker.ld -o kernel.bin loader.o test.o
  test.o: En función main':
test.c:(.text+0xfc): undefined reference to
Testing '

¿Qué tengo que hacer?

¿Fue útil?

Solución

Editar Para reflejar la pregunta del OP he golpeado a cabo algunas líneas de mi respuesta a pesar de ser upvoted ...

¿Por qué se kernel.c marcado en el compilador, a pesar de que usted no tiene que mencionar aquí? Me estoy perdiendo algo ...

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$

tal vez usted tiene que hacerlo de esta manera en algún lugar en el archivo de cabecera como yo te estoy juzgando desee kernel para el acceso a esta función:

extern void Testing();

Y, llevará a cabo todas sus funciones y colocarlos en un archivo .c separada, que no debería estar ahí en el primer lugar ... por ejemplo:

Testing.c
/* all your functions here */

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

Espero que esta ayuda, Atentamente, Tom.

Otros consejos

No puedo volver a crear el problema. Este funciona como se espera cuando intento compilar el código en una máquina de Ubuntu (que basa en su pasta, supongo que está utilizando.)

¿Está seguro de que el # include está sucediendo correctamente?

Trate de usar -E-c en lugar de ver lo que el código de todo el compilador está tratando de compilar se parece.

Un poco de un tiro en la oscuridad aquí, ya que mi C es un poco oxidado, pero C permite poner cuerpos de las funciones en una cabecera? No recuerdo que lo hace. Trate de mover la definición de Prueba () y print () en un archivo .c? También puede probar la compilación como C ++ como ver si se soluciona el problema, si no necesita / quiere C.

test.h incluido en main.c, mientras que sus declaraciones, de acuerdo con lo que su escribieron, están en test1.h. Tenga en cuenta el 1 en el nombre.

Además de eso, está compilando test.c y la vinculación test.o, mientras que en realidad el nombre de su archivo es test1.c. Una vez más, tenga en cuenta el 1 en el nombre.

Editar Ahora se edita el nombre del archivo incluido en main.c. Después de la edición que es seguro afirmar que la mayor parte de los síntomas que usted describe en no son possble con las versiones actuales de los archivos. Vuelva a verificar lo que está haciendo, publicar información actualizada disgnostic y / o de código postal real.

Aún así, compilador y enlazador líneas está haciendo referencia a los nombres de archivo de edad.

i donno qué está causando esto, pero he tenido este problema en este momento. tratar de eliminar el archivo .h y poner las declaraciones de las funciones en la parte superior del propio archivo .c.

En este caso, elimine el test1.h y poner las declaraciones de funciones de test1.c en test1.c. e incluir test1.c en test.c No vas a encontrar que el mensaje de advertencia más, ni los siguientes errores de enlace.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top