Cómo usar un archivo de encabezado en c

Definí un método en la clase MyStrLen.c, lo implementé y lo declaré en el archivo principal MyStrLen.h. Lo que quería era usar un método de MyStrLen en otra clase MyStrCmp.c pero muestra un error de comstackción en el shell. cuando bash hacer el archivo o.

MyStr.h

int inputLen(char* myStr); 

MyStr.c

 int inputLen(char* myStr) { .... .... } 

MyStrCmp.c

  #include "MyStr" void method() { inputLen(someinput) } 

Y este es el error de comstackción.

MyStrCmp.c :(. Text + 0x18): referencia no definida a inputLen' MyStrCmp.c:(.text+0x29): undefined reference to inputLen’ MyStrCmp.c :(. Text + 0x55): referencia no definida a inputLen' MyStrCmp.c:(.text+0x77): undefined reference to inputLen ‘

A la derecha, la lista de verificación básica es la siguiente:

  • ¿ MyStrCmp.c incluye el archivo MyStr.h : #include "MyStr.h" debería estar en la parte superior del archivo (junto a #include y #include )
  • ¿ MyStr.c hace lo mismo? Con esto quiero decir que incluya su propio archivo de encabezado ( #include "MyStr.h" )
  • ¿Están los 3 archivos mencionados ( MyStrCmp.c , MyStr.c y MyStr.h ) en el mismo directorio?
  • ¿Está pasando tanto el archivo MyStrCmp.c como el archivo MyStr.c a gcc?

Si la respuesta a todas las 4 de estas preguntas es sí, entonces:

 $ gcc -o MyStrCmp -Wall MyStrCmp.c MyStr.c -std=c99 

Deberia trabajar. Debido a la forma en que ha escrito la función inputLen (en MyStr.c ), se escribe como un archivo que puede comstackrse externamente o por separado ( gcc -o MyStr.c , para producir un archivo-o). Como resultado, la vinculación se debe hacer explícitamente, pasando ambos archivos de origen al comstackdor. Por cierto, se pueden encontrar más detalles en esta pregunta duplicada.
Básicamente, abra una ventana de terminal e ingrese los siguientes comandos:

 $ mkdir test $ cd test/ $ touch MyStr.c && touch MyStr.h && touch MyStrCmp.c $ vim MyStr.c MyStr.h -O 

Yo uso Vim, puedes usar tu editor preferido, pero ese no es el punto.
En el archivo MyStr.h , escribe:

 int inputLen(char* myStr); 

MyStr.c y ciérrelo, luego edite el archivo MyStr.c y defina su función real:

 #include "MyStr.h" #include  #include  #include  int inputLen(char *myStr) { printf("%s\n", myStr); return strlen(myStr); } 

Guarde y cierre, luego edite el archivo MyStrCmp.c y escriba algo como:

 #include  #include  #include "MyStr.h" int main(int argc, char **argv ) { const char *test = "Some test-string"; int l = 0; l = inputLen(test); printf("The printed string is %d long\n", l); return EXIT_SUCCESS; } 

Luego comstack con el comando que he proporcionado anteriormente. Esto funcionó bien para mí …

En MyStrCmp.c , ponga esto en la parte superior:

 #include "MyStr.h" 

Su “MyStr.h” debería tener esto: extern int inputLen(char* myStr);

y su “MyStr.c” debería tener #include y su MyStrCmp.c también debería tener #include

¡Siempre que, todos los encabezados y fonts estén en el mismo directorio!

Para evitar confusiones de inclusión múltiple: use protectores de encabezado

 #ifndef MYSTR_H #define MYSTR_H extern int inputLen(char* myStr); #endif 

La respuesta puede ser que no ha utilizado el comando de comstackción correcto.

Debe usar el indicador -c (si está utilizando gcc) para crear un archivo .o, de lo contrario, gcc intentará vincular el ejecutable y, sin saber acerca de MyStr.c, no podrá encontrar la función inputLen.

Intente comstackr Mystr.c y MyStrCmp.c por separado usando -c y luego vincule los archivos .o.

Mencionas en un comentario que “lo comstackste”, pero debes asegurarte de que los dos archivos se combinen con el enlazador.