我正在尝试链接两个先前创建的目标文件的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
答案 0 :(得分:1)
根据this GNU make
documentation,GNU make程序将尝试使用GNUMakefile
,makefile
或Makefile
。
make
程序将不尝试makefile.mk
,这意味着例如make linked
将不使用任何makefile,而仅使用默认规则。
您可以通过将makefile重命名为Makefile
(最常见)或makefile
来解决此问题。或使用-f
选项指定生成文件
$ make -f makefile.mk linked