在C语言中进行编译时如何解决“未定义的引用”?

时间:2019-04-10 06:25:12

标签: c

我正在尝试链接两个先前创建的目标文件的C程序,但始终收到“未定义引用”错误。

我正在使用Visual Code编写代码,并使用Windows上的Ubuntu使用makefile进行编译。做成目标文件的两个C文件 task5.c reverse.c 都包含#include reverse.h语句,这些语句包含< strong> reverse.c 。

task5.c

#include <stdio.h>
#include "ctap.h"
#include "reverse.h"

TESTS {
    const char *a = "Family";
    char *b = reverse(a);

    //test 1
    ok(string_length(a) == string_length(b), "Strings are the same size");

    //test 2
    is("ylimaF", b, "Strings match");
}

reverse.c

#include <stdio.h>
#include <stdlib.h>
#include "reverse.h"

char *reverse(const char *str) {
    //code
}

int string_length(const char *str) {
    //code
}

reverse.h

char *reverse(const char *str);
int string_length(const char *str);

makefile

linked:
    gcc -o linked task5.o reverse.o

task5.o
    gcc -c -o task5.o task5.c

reverse.o
    gcc -c -o reverse.o reverse.c

当我运行命令make linked时,我希望它会发出并且什么都不返回。

但是当我运行该命令时,出现此错误:

cc   task5.o   -o linked
task5.o: In function `ctap_tests':
task5.c:(.text+0x1abe): undefined reference to `reverse'
task5.c:(.text+0x1ace): undefined reference to `string_length'
task5.c:(.text+0x1adc): undefined reference to `string_length'
collect2: error: ld returned 1 exit status
<builtin>: recipe for target 'linked' failed
make: *** [task5] Error 1

1 个答案:

答案 0 :(得分:1)

根据this GNU make documentation,GNU make程序将尝试使用GNUMakefilemakefileMakefile

make程序将尝试makefile.mk,这意味着例如make linked将不使用任何makefile,而仅使用默认规则。

您可以通过将makefile重命名为Makefile(最常见)或makefile来解决此问题。或使用-f选项指定生成文件

$ make -f makefile.mk linked