创建头文件并在C中测试它

时间:2017-07-31 14:30:29

标签: c segmentation-fault header-files cs50

我的文件位于同一目录中:

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

但它显示未定义的引用&quot; selection_sort&#39;当我编译:

$ make test_selection_sort

....undefined reference to `selection_sort'

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

编辑:

我现在可以制作文件:

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

3 个答案:

答案 0 :(得分:4)

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

selection_sort.c

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

答案 1 :(得分:4)

C构建系统是旧的,并且源文件中的包含文件只是包含,通常用于声明外部函数或全局变量。但它没有提示链接器需要什么模块。另一方面,其他语言,如C#,Java或Python import 模块,它们都为编译部分声明了标识符,但也声明了链接器将已编译的模块添加到程序中。

在C中程序员必须同时:

  • 使用编译器的包含文件
  • 明确链接不同的编译单元或库。

通过仅声明如何构建可执行文件并在源被修改时自动重建目标文件,makefile可以变得方便。

或者,您可以使用:

进行构建
cc test_selection.c selection_sort.c -o test_selection

但效率较低,因为即使没有更改文件,它也会一直编译两个文件

答案 2 :(得分:2)

可能你没有正确编译。修复你的makefile。 试试这个:

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