gpt4 book ai didi

编译器对 make 文件发出错误提示

转载 作者:行者123 更新时间:2023-11-30 19:28:56 24 4
gpt4 key购买 nike

在尝试编写一个具有 main 和一个函数的简单程序之后,我请求您帮助找到该错误。我包含了 3 个正在运行的文件:

  • base.c中的主要函数
  • fun.c中的函数
  • makefile

编译器说该函数在 main 中以错误的方式调用:

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

fun.c

#include <stdio.h>

int fun(char c)
{
printf("%d3 is the value of your char!\n", 'c');
return 0;
}

makefile

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.ofun.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,尽管这“有效”;它只是没有达到您的预期。请注意,您应该使用显式的 int main(void) { … }。您可能应该创建一个 header fun.h ,其中包含:

extern int fun(char c);
两个源文件中的

#include "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

事实上,您不需要将源文件列为目标文件的依赖项; make 将自动推断该依赖关系。但你确实需要指定头文件依赖。

关于编译器对 make 文件发出错误提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53460701/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com