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

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

在尝试编写一个包含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=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