【问题标题】:Function main is missing while compiling with Makefile使用 Makefile 编译时缺少 main 函数
【发布时间】:2018-06-22 14:52:16
【问题描述】:

我正在尝试将源代码编译成二进制。

在两个源文件中,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

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)

这会返回错误:

/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o:在函数_start': (.text+0x20): undefined reference tomain' collect2: error: ld 返回 1 个退出状态

请指教!

【问题讨论】:

    标签: gcc makefile


    【解决方案1】:

    错误源于这部分

    $(BINARY): sub.o main.o 
        $(CC) $(CFLAGS) $(LDADD) -o $@ $<
    

    变量$&lt;只指第一个依赖,这里是sub.omain.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)
    

    在这里,当前目录中的所有 .c 文件都被编译为目标文件,然后链接到可执行文件中(如果您不想要每个 .c 文件,而是需要某个选择,请调整 wildcard 行)。

    【讨论】:

    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-26
    相关资源
    最近更新 更多