C语言 无法获取makefile以创建可执行文件

omvjsjqw  于 2023-08-03  发布在  其他
关注(0)|答案(1)|浏览(111)

我试图使一个程序,需要一个可执行文件,我已经按照这个教程https://www.youtube.com/watch?v=_r7i5X0rXJk&t,但我似乎不能得到一个可执行文件。我拿到了所有的档案所以我不知道到底出了什么问题

CC = gcc
CFLAGS = -g -std=gnu11 -Wall

mmake: mmake.o parser.o
    $(CC) $(CFLAGS) -o mmake parser.o mmake.o

parser.o: parser.c parser.h
    $(CC) $(CFLAGS) -c parser.c

mmake.o: mmake.c
    $(CC) $(CFLAGS) -c mmake.c

字符串
我试过看其他的makefile,但是它们看起来比我的要复杂得多,所以它们没有太大的帮助
我的输出如下

gcc -g -std=gnu11 -Wall -c mmake.c
gcc -g -std=gnu11 -Wall -c parser.c
gcc -g -std=gnu11 -Wall -o mmake parser.o mmake.o
/usr/bin/ld: mmake.o: in function `parse_makefile':
/home/c15/c15osn/workspace/Cprogg/SysN2022/Mmake/parser.c:201: multiple definition of `parse_makefile'; parser.o:/home/c15/c15osn/workspace/Cprogg/SysN2022/Mmake/parser.c:201: first defined here
/usr/bin/ld: mmake.o: in function `makefile_del':
/home/c15/c15osn/workspace/Cprogg/SysN2022/Mmake/parser.c:301: multiple definition of `makefile_del'; parser.o:/home/c15/c15osn/workspace/Cprogg/SysN2022/Mmake/parser.c:301: first defined here
/usr/bin/ld: mmake.o: in function `makefile_default_target':
/home/c15/c15osn/workspace/Cprogg/SysN2022/Mmake/parser.c:226: multiple definition of `makefile_default_target'; parser.o:/home/c15/c15osn/workspace/Cprogg/SysN2022/Mmake/parser.c:226: first defined here
/usr/bin/ld: mmake.o: in function `makefile_rule':
/home/c15/c15osn/workspace/Cprogg/SysN2022/Mmake/parser.c:238: multiple definition of `makefile_rule'; parser.o:/home/c15/c15osn/workspace/Cprogg/SysN2022/Mmake/parser.c:238: first defined here
/usr/bin/ld: mmake.o: in function `rule_prereq':
/home/c15/c15osn/workspace/Cprogg/SysN2022/Mmake/parser.c:254: multiple definition of `rule_prereq'; parser.o:/home/c15/c15osn/workspace/Cprogg/SysN2022/Mmake/parser.c:254: first defined here
/usr/bin/ld: mmake.o: in function `rule_cmd':
/home/c15/c15osn/workspace/Cprogg/SysN2022/Mmake/parser.c:267: multiple definition of `rule_cmd'; parser.o:/home/c15/c15osn/workspace/Cprogg/SysN2022/Mmake/parser.c:267: first defined here
collect2: error: ld returned 1 exit status
make: *** [Makefile:9: mmake] Error 1

wtlkbnrh

wtlkbnrh1#

永远不要在代码中包含.c.cpp文件,因为这会导致链接时重定义错误。
mmake.c文件中的#include "parser.c"替换为#include "parser.h",错误将消失。
每个声明应该只有一个实现。因此,当包含.c文件时,一个实现转到parser.o,另一个实现转到mmake.o,这会导致链接器的重定义错误。然而,当你包含.h文件时(注意,你不应该把你的实现放在.h文件中),你只包含声明,并通知编译器函数或其他结构存在,但在链接阶段链接到实现(在.c文件中)。

相关问题