2016-12-05 142 views
0

我正在嘗試製作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 $< [email protected] 

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

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

.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 
+0

也許沒有你在Makefile中列出的文件中有一個主要功能 – bruceg

+2

請出示實際的命令'make'想跑。這可能有助於從規則中刪除符號「@」。 –

+0

@bruceg'bitcnts.c'有一個主要功能。 – Mrchacha

回答

1

這條規則

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

擴展到

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.cbitcnt_3.cbitcnt_4.cbitcnts.cbitfiles.cbitstrng.cbstr_i.c,被守候的修改,但從來沒有編譯成對象,如果你的main()bitcnts.cbitcnts.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 [email protected] 

prog.elf : $(OBJECTS) $(LIB_O) 
    @${LD} $^ -o [email protected] ${LDFLAGS} 
+0

我得到這個錯誤:riscv64-unknown-elf-gcc:致命錯誤:無法指定-o與-c,-S或-E與多個文件 – Mrchacha

+0

@Mrchacha對不起,這是我的錯誤。嘗試這個。 –

+0

現在有效。謝謝! – Mrchacha