¿Qué debo hacer si obtengo una referencia indefinida a "principal" al compilar .o en lenguaje C?
En términos generales, si falta el archivo de encabezado correspondiente, cuando cree un nuevo proyecto, elija la aplicación de consola, no el proyecto MFC.
La función principal debería escribirse como int main(), pero la escribiste como mian.
Falta de archivos de biblioteca relevantes (.a/.so)
Aquí, solo se utiliza la biblioteca estática como ejemplo, asumiendo que el código fuente es el siguiente.
Primero, compilamos test.c en un archivo de biblioteca estática (.a)
gcc -c test.c
ar -rc test.a test .o
En este punto, tenemos el archivo test.a. Comenzamos a compilar main.c
gcc -c main.c
En este momento, se genera el archivo main.o y luego usamos el siguiente comando para vincularlo, y obtenemos el Ejecutar el programa.
gcc -o main main.o
Encontrarás que el compilador informa un error:
/tmp/ccCPA13l.o: En la función `main' En:
main.c: (.text 0x7): referencia indefinida a `test'
collect2: ld devolvió 1 estado de salida
Esta situación ocurre. La causa principal es que no se encuentra el archivo de implementación de la función test(). Dado que la implementación de la función test() está en la biblioteca estática test.a, es necesario agregar test.a a la biblioteca después del enlace. comando de enlace, el comando de enlace se puede modificar de la siguiente forma.
gcc -o main main.o ./test.a ?//Nota: .
Extensión: De manera similar, para ilustrar el problema, separamos la compilación y el enlace de El código anterior, si desea generar un programa ejecutable a la vez, puede ejecutar los siguientes comandos en main.c y test.a. /test.a ?//Del mismo modo, si no hay test.a, el sistema informará un error.