我试图使一个程序,需要一个可执行文件,我已经按照这个教程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
型
1条答案
按热度按时间wtlkbnrh1#
永远不要在代码中包含
.c
或.cpp
文件,因为这会导致链接时重定义错误。将
mmake.c
文件中的#include "parser.c"
替换为#include "parser.h"
,错误将消失。每个声明应该只有一个实现。因此,当包含
.c
文件时,一个实现转到parser.o
,另一个实现转到mmake.o
,这会导致链接器的重定义错误。然而,当你包含.h
文件时(注意,你不应该把你的实现放在.h
文件中),你只包含声明,并通知编译器函数或其他结构存在,但在链接阶段链接到实现(在.c
文件中)。