创建头文件并在 C 语言中对其进行测试



我在同一个目录中有文件:

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; 
}
}

注意:此selection_sort((在我以前的使用中工作正常。

selection_sort.h

#include <cs50.h>
void selection_sort(int values[], int n);

最后一个文件是测试文件,名为 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]);
}
}

但是当我编译时,它显示了对"selection_sort"的未定义引用:

$ make test_selection_sort
....undefined reference to `selection_sort'

我想了解定义的头文件的问题和我的错误用法?


编辑:

我现在可以制作文件:

$gcc -o selection selection_sort.c test_selection_sort.c
$./selection

错误消息很可能意味着您未能包含编译selection_sort.c时生成的 .o 文件。 仅仅包含头文件是不够的,尽管这样做很重要。

gcc -c selection_sort.c
gcc -c test_selection_sort.c
gcc -o test_selection_sort selection_sort.o test_selection_sort.o

还有许多其他方法可以完成同样的事情。 如果要创建多个实用程序函数,请考虑使用ar工具将它们全部放入对象库中,然后将该库包含在-l选项中。

C 构建系统是一个旧的系统,包含文件通常只是包含在源文件中以声明外部函数或全局变量。但它没有为链接器提供关于需要哪些模块的提示。另一方面,其他语言如C#,Java或Python导入模块,这些模块既声明了编译部分的标识符,又声明了链接器已经编译的模块将被添加到程序中。

在 C 语言中,程序员必须同时满足以下条件:

  • 将包含文件用于编译器
  • 显式链接不同的编译单元或库。

这就是 makefile 可以变得很方便的地方,只需声明一次如何构建可执行文件,并在源被修改时自动重建目标文件。

或者,您可以使用以下内容进行构建:

cc test_selection.c selection_sort.c -o test_selection

但它的效率较低,因为它始终如一地编译两个文件,即使一个文件没有更改

可能是你没有正确编译。修复生成文件。 试试这个:

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)

只需键入

make

相关内容

  • 没有找到相关文章

最新更新