otro - crear archivo de encabezado y probarlo en C
incluir header en c (3)
El sistema de compilación C es antiguo, y un archivo de inclusión simplemente se incluye en el archivo fuente normalmente para declarar funciones externas o variables globales. Pero no da ninguna pista para el vinculador sobre qué módulos se requieren. Por otro lado, otros lenguajes como C #, Java o Python importan módulos que declaran identificadores para la parte de compilación, pero también declaran el enlazador, lo que el módulo ya compilado se agregará al programa.
En C, el programador debe:
- usar incluir archivos para el compilador
- vincular explícitamente las diferentes unidades de compilación o biblioteca.
Ahí es donde un archivo MAKE puede ser útil al declarar solo una vez cómo construir el ejecutable y reconstruye automáticamente los archivos objeto si el código fuente fue modificado.
Alternativamente, puedes construir con:
cc test_selection.c selection_sort.c -o test_selection
pero es menos eficiente porque compila consistentemente ambos archivos, incluso si uno no ha cambiado
Tengo archivos en el mismo directorio:
selection_sort.c
#include <cs50.h>
#include "selection_sort.h"
void selection_sort(int values[], int n)
{
for (int i = 0; i < n; i++)
{
int min_index = i;
for (int j = i+1; j < n; j++)
{
if (values[j] < values[min_index])
{
min_index = j;
}
}
int temp = values[i];
values[i] = values[min_index];
values[min_index] = temp;
}
}
NOTA: Este selection_sort () funciona bien en mi uso anterior.
selection_sort.h
#include <cs50.h>
void selection_sort(int values[], int n);
El último archivo es el archivo de prueba, llamado test_selection_sort.h
#include <cs50.h>
#include <stdio.h>
#include <stdlib.h>
#include "selection_sort.h"
int test_array[] = {2,4,7,5,9,1,3,6,8};
int main()
{
int size = sizeof(test_array);
selection_sort(test_array,size);
for (int i = 0; i < size; i++)
{
printf ("sorted %d", test_array[i]);
}
}
Pero muestra una referencia indefinida a ''selection_sort'' cuando compilo:
$ make test_selection_sort
....undefined reference to `selection_sort''
Me gustaría entender el problema con el archivo de cabecera definido y mi uso incorrecto?
Editar:
Puedo hacer un archivo ahora:
$gcc -o selection selection_sort.c test_selection_sort.c
$./selection
Es muy probable que el mensaje de error indique que no ha podido incluir el archivo .o resultante al compilar selection_sort.c
. No es suficiente simplemente incluir el archivo de encabezado, aunque eso es importante.
gcc -c selection_sort.c
gcc -c test_selection_sort.c
gcc -o test_selection_sort selection_sort.o test_selection_sort.o
Hay muchas otras maneras de lograr esto mismo. Si vas a crear múltiples funciones de utilidad, considera usar la herramienta ar
para ponerlas todas en una biblioteca de objetos y luego incluir la biblioteca con la opción -l
.
Probablemente no compiló correctamente. Arregle su archivo MAKE. Prueba esto:
OBJS = selection_sort.o test_selection_sort.o
TARGET = test_selection_sort
CC = gcc
MODE = -std=c99
DEBUG = -g
DEPS = selection_sort.h
CFLAGS = -Wall -c $(DEBUG)
LFLAGS = -Wall $(DEBUG)
%.o: %.c $(DEPS)
$(CC) $< $(CFLAGS) $(MODE)
all: $(OBJS)
$(CC) $^ $(LFLAGS) -o $(TARGET) $(MODE)
Sólo tipo
make