C 编译器对make文件发出错误提示
在尝试编写一个包含main和一个函数的简单程序之后, 我请求你帮我找到这个bug。我包括正在运行的3个文件:C 编译器对make文件发出错误提示,c,makefile,C,Makefile,在尝试编写一个包含main和一个函数的简单程序之后, 我请求你帮我找到这个bug。我包括正在运行的3个文件: base.c fun.c makefile 编译器说函数在主目录中的调用方式不正确: undefined reference to `fun' base.c #include <stdio.h> int fun(char c); main() { printf("please enter a single char\n"); char c=getch
base.c
fun.c
makefile
undefined reference to `fun'
base.c
#include <stdio.h>
int fun(char c);
main()
{
printf("please enter a single char\n");
char c=getchar();
fun(c);
return 0;
}
#include <stdio.h>
int fun(char c)
{
printf("%d3 is the value of your char!\n", 'c');
return 0;
}
charprint: base.o fun.o
gcc -g -Wall -ansi base.o fun.o -o charprint
base.o: base.c
gcc -g -Wall -ansi base.c -o base.o
fun.o: fun.c
gcc -g -Wall -ansi fun.c -o fun.o
makefile
#include <stdio.h>
int fun(char c);
main()
{
printf("please enter a single char\n");
char c=getchar();
fun(c);
return 0;
}
#include <stdio.h>
int fun(char c)
{
printf("%d3 is the value of your char!\n", 'c');
return 0;
}
charprint: base.o fun.o
gcc -g -Wall -ansi base.o fun.o -o charprint
base.o: base.c
gcc -g -Wall -ansi base.c -o base.o
fun.o: fun.c
gcc -g -Wall -ansi fun.c -o fun.o
编译问题是您忘记了
base.o
和fun.o
的编译器行中的-c
标志。一个显而易见的简单(但不是很好)修复方法是:
charprint: base.o fun.o
gcc -g -Wall -ansi base.o fun.o -o charprint
base.o: base.c
gcc -c -g -Wall -ansi base.c -o base.o
fun.o: fun.c
gcc -c -g -Wall -ansi fun.c -o fun.o
有趣的是,最简单的修复方法是删除两个目标文件的两个编译器命令——make知道如何将C文件编译成目标文件。您可以设置CFLAGS+=-Wall(或CFLAGS=-Wall)以包含(非常重要的)-Wall标志。添加-Werror
也会很好
CFLAGS += -Wall -Werror -g -std=c11
charprint: base.o fun.o
${CC} ${CFLAGS} base.o fun.o -o $@
base.o: base.c
fun.o: fun.c
在fun()
的代码中,printf()
的参数应该是c
,而不是'c'
。您可能还指的是%3d
,而不是%d3
,尽管这“有效”;它只是没有达到你的期望。注意,应该使用显式的intmain(void){…}
。您可能应该创建一个标题fun.h
,其中包含:
extern int fun(char c);
和#在两个源文件中都包含“fun.h”
,并在makefile的依赖项行中的源文件名后添加fun.h
:
CFLAGS += -Wall -Werror -g -std=c11
charprint: base.o fun.o
${CC} ${CFLAGS} base.o fun.o -o $@
base.o: base.c fun.h
fun.o: fun.c fun.h
事实上,您不需要将源文件列为目标文件的依赖项<代码>生成将自动推断该依赖关系。但是您确实需要指定头文件依赖项。在
fun()
的代码中,您对printf()
的参数应该是c
,而不是'c'
。您可能还指的是%3d
,而不是%d3
,尽管这“有效”;它只是没有达到你的期望。请注意,您应该使用显式的intmain(void){…}
。编译问题是您忘记了base.o
和fun.o的编译器行中的-c
标志。有趣的是,最简单的修复方法是删除两个目标文件的两个编译器命令-make
知道如何将C文件编译成目标文件。您可以设置CFLAGS+=-Wall
(或CFLAGS=-Wall
)以包含(非常重要的)-Wall
标志。添加-Werror
也很好。非常感谢!注意:ANSI-C已经过时近20年了。使用现代标准C,即C11。17.难道不应该在Makefile中定义${CC}吗?make
附带了许多预定义的宏,例如CFLAGS
和CC
。例如,您可以看到哪些是内置的make-p-f/dev/null
。