【问题标题】:Undefined reference to main error对主要错误的未定义引用
【发布时间】:2016-12-05 19:34:45
【问题描述】:

我正在尝试制作bitcount 基准应用程序的 Makefile。原始 Makefile 有效,但我想根据需要更改 Makefile。我想先创建一个目标文件,然后用它来创建.elf和.bin文件。

bitcnts: ${FILE} Makefile
    gcc -static ${FILE} -O3 -o bitcnts

但我收到一条错误消息,提示 undefined reference to main':

/opt/riscv/bin/../lib/gcc/riscv64-unknown elf/4.9.2/../../../../riscv64-unknown-
elf/lib/soft-float/32/crt0.o: 
In function `.L0 ': (.text+0x40): undefined reference to `main'
collect2: error: ld returned 1 exit status
Makefile:23: recipe for target 'prog.elf' failed
make[1]: *** [prog.elf] Error 1

尝试的 Makefile 如下所示:

CROSS=riscv64-unknown-elf-
CC=$(CROSS)gcc    
LD=$(CROSS)g++
OBJCOPY=$(CROSS)objcopy
LIB_O=$(LIB)mutex.o $(LIB)wrap_malloc.o

CFLAGS_SYS=-m32 -msoft-float
LDFLAGS_SYS=-m32 -msoft-float -T$(LDFILE) -Wl,--wrap,malloc -Wl,--wrap,free -Wl,
--wrap,calloc -Wl,--wrap,realloc -Wl,--wrap,_malloc_r -Wl,--wrap,_free_r -Wl,
--wrap,_calloc_r -Wl,--wrap,_realloc_r

CFLAGS=-g $(CFLAGS_SYS) -O2 -std=gnu99 -Wall -I$(LIB) -I./
LDFLAGS=-g $(LDFLAGS_SYS)


FILE = bitcnt_1.c bitcnt_2.c bitcnt_3.c bitcnt_4.c bitcnts.c bitfiles.c 
bitstrng.c bstr_i.c

MAIN = bitcnts

.PHONY : all
all: prog.elf

prog.bin : prog.elf
   @${OBJCOPY} -R .uncached -R .tileram -O binary $< $@

prog.elf : $(MAIN).o $(LIB_O)
   @${LD} $^ -o $@ ${LDFLAGS}

$(MAIN).o : $(FILE)
   @${CC} ${CFLAGS} -c $< -o $@

.PHONY: build
build: all

然后构建:

# Build
.PHONY: bitcount-build
bitcount-build:
  @make -C $(MIBENCH)/automotive/bitcount build
# Run
.PHONY: bitcount-run
bitcount-run:
  @make -C $(MIBENCH)/automotive/bitcount run

【问题讨论】:

  • 可能你在 Makefile 中列出的所有文件都没有 main 函数
  • 请显示make 尝试运行的实际命令。从规则中删除 @ 符号可能会有所帮助。
  • @bruceg bitcnts.c 有一个主函数。
  • @BenVoigt 我添加了 make 命令。
  • 不,我的意思是make 扩展@${CC} ${CFLAGS} -c $&lt; -o $@ 进入并运行的命令。

标签: c makefile compiler-errors


【解决方案1】:

这条规则

$(MAIN).o : $(FILE)
   @${CC} ${CFLAGS} -c $< -o $@

扩展到

bitcnts.o: bitcnt_1.c bitcnt_2.c bitcnt_3.c bitcnt_4.c bitcnts.c bitfiles.c bitstrng.c bstr_i.c
    ...-gcc [all the flags] -c bitcnt_1.c -o bitcnts.o
                               ^^^^^^^^^^ $< is this only

其他文件,bitcnt_2.c,bitcnt_3.c,bitcnt_4.c,bitcnts.c,bitfiles.c,bitstrng.c,bstr_i.c,被监视修改但永远不会编译到对象中,如果你的@987654332 @ 在 bitcnts.c 中,bitcnts.o 不会包含它。

实际上,您想做的事情并不能那么容易完成(对不起,我的答案的先前版本是错误的)。 One object file comes from one translation unit(基本上来自一个 C 文件)。所以你必须做8个。幸运的是,Makefile 使用 static patterns 也不会太难:

OBJECTS = $(FILE:%.c=%.o)

$(OBJECTS): %.o: %.c
    @${CC} ${CFLAGS} -c $< -o $@

prog.elf : $(OBJECTS) $(LIB_O)
    @${LD} $^ -o $@ ${LDFLAGS}

【讨论】:

  • 我收到此错误:riscv64-unknown-elf-gcc: 致命错误:无法将 -o 与 -c、-S 或 -E 与多个文件指定
  • @Mrchacha 抱歉,这是我之前的错误。试试这个。
猜你喜欢
  • 2011-10-16
  • 1970-01-01
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-03
  • 2021-09-07
  • 2012-02-27
  • 2012-03-12
相关资源
最近更新 更多