Gcc 使用Makefile编译时缺少函数main
我试图将源代码编译成二进制 在两个源文件中,main函数定义在一个(main.c)中。但是,在将源代码编译成二进制文件时,仍然会出现以下错误 这是我的Makefile:Gcc 使用Makefile编译时缺少函数main,gcc,makefile,Gcc,Makefile,我试图将源代码编译成二进制 在两个源文件中,main函数定义在一个(main.c)中。但是,在将源代码编译成二进制文件时,仍然会出现以下错误 这是我的Makefile: CC = gcc LD = ld AR = ar NM = nm OBJCOPY = objcopy OBJDUMP = objdump READELF = readelf CFLAGS += -Wall -I. LDADD += -lpthread -ldl -L. -llob
CC = gcc
LD = ld
AR = ar
NM = nm
OBJCOPY = objcopy
OBJDUMP = objdump
READELF = readelf
CFLAGS += -Wall -I.
LDADD += -lpthread -ldl -L. -llob
BINARY=test
.PHONY: all
all: $(BINARY)
main.o: main.c
$(CC) $(CFLAGS) -c -o $@ $<
sub.o: sub.c
$(CC) $(CFLAGS) -c -o $@ $<
$(BINARY): sub.o main.o
$(CC) $(CFLAGS) $(LDADD) -o $@ $<
.PHONY: clean
clean:
rm -f $(OBJS) $(BINARY)
CC=gcc
LD=LD
AR=AR
纳米=纳米
OBJCOPY=OBJCOPY
OBJDUMP=OBJDUMP
READELF=READELF
CFLAGS+=-Wall-I。
LDADD+=-lpthread-ldl-L.-llob
二进制=测试
冒牌货:全部
全部:$(二进制)
main.o:main.c
$(CC)$(CFLAGS)-c-o$@$<
sub.o:sub.c
$(CC)$(CFLAGS)-c-o$@$<
$(二进制):sub.o main.o
$(CC)$(CFLAGS)$(LDADD)-o$@$<
.假冒:干净
清洁:
rm-f$(OBJS)$(二进制)
这将返回错误:
/usr/lib/gcc/x86_64-linux-gnu/5/./../../../x86_64-linux-gnu/crt1.o:在函数\u start'中:
(.text+0x20):未定义对
main'的引用
collect2:错误:ld返回了1个退出状态
请告知 错误源于此部分
$(BINARY): sub.o main.o
$(CC) $(CFLAGS) $(LDADD) -o $@ $<
其中,$^
指的是所有预请求站点(感谢@MadScientist指出这一点)。还可以考虑将源文件和对象文件存储在变量中。我建议将编译源代码和链接的规则替换为以下内容
SRC = $(wildcard *.c)
OBJ = $(SRC:%.c=%.o)
%.o: %.c
$(CC) $(CFLAGS) -c -o $@ $<
$(BINARY): $(OBJ)
$(CC) $(CFLAGS) $(LDADD) -o $@ $(OBJ)
SRC=$(通配符*.c)
OBJ=$(SRC:%.c=%.o)
%.o:%.c
$(CC)$(CFLAGS)-c-o$@$<
$(二进制):$(OBJ)
$(CC)$(CFLAGS)$(LDADD)-o$@$(OBJ)
在这里,当前目录中的所有.c文件都被编译成目标文件,然后链接到可执行文件中(如果您不希望每个.c文件都有一个特定的选择,请调整
通配符
行)。您可以使用$^
表示所有先决条件。看见
SRC = $(wildcard *.c)
OBJ = $(SRC:%.c=%.o)
%.o: %.c
$(CC) $(CFLAGS) -c -o $@ $<
$(BINARY): $(OBJ)
$(CC) $(CFLAGS) $(LDADD) -o $@ $(OBJ)