使文件不起作用?

问题描述 投票:0回答:1

找到解决方案。见下图:

我试图让我的 makefile 将三个 C 程序编译成一个可执行文件,但出现以下错误:

cachesim.o: could not read symbols: File in wrong format

是的,我每次使用它时都使用make clean。 make文件如下

CC     = gcc
CFLAGS = -Wall -m32 -O -g

all:  cachesim cache trace_file_parser 
gcc -o cachesim cachesim.o cache.o trace_file_parser.o

cachesim:       cachesim.c
        $(CC) -c -o cachesim.o cachesim.c $(CFLAGS)

cache:          cache.c
        $(CC) -c -o cache.o cache.c $(CFLAGS)

trace_file_parser:  trace_file_parser.c
        $(CC) -c -o trace_file_parser.o trace_file_parser.c $(CFLAGS)

clean:
rm -f *.o

我不明白这是为什么......

我每次都使用 make clean。

尝试编译:

[katiea@mumble-15] (34)$ make clean
rm -f *.o
[katiea@mumble-15] (35)$ ls
cache.c   cache.h     cachesim.c~      gcc_trace  Makefile~     trace_file_parser.c
cache.c~  cachesim.c  cache_structs.h  Makefile   strgen_trace  trace_file_parser.h
[katiea@mumble-15] (36)$ make
gcc -c -o cachesim.o cachesim.c -Wall -m32 -O -g
gcc -c -o cache.o cache.c -Wall -m32 -O -g
gcc -c -o trace_file_parser.o trace_file_parser.c -Wall -m32 -O -g
gcc -o cachesim cachesim.o cache.o trace_file_parser.o
cachesim.o: could not read symbols: File in wrong format
collect2: ld returned 1 exit status
make: *** [all] Error 1

解决方案

CC     = gcc

CFLAGS = -Wall -m32 -O -g

all:  cachesim.c cache.c trace_file_parser.c
$(CC) -o cachesim cachesim.c cache.c trace_file_parser.c $(CFLAGS)

cachesim:       cachesim.c
        $(CC) -c -o cachesim.o cachesim.c $(CFLAGS)

cache:          cache.c
        $(CC) -c -o cache.o cache.c $(CFLAGS)

trace_file_parser:  trace_file_parser.c
        $(CC) -c -o trace_file_parser.o trace_file_parser.c $(CFLAGS)

clean:
rm -f *.o
gcc makefile executable
1个回答
6
投票

请阅读 makefile 简介。 这对我来说就像是家庭作业。

makefile 最基本的原则之一是目标应该是您正在构建的实际文件。 这些规则都是假的:

cachesim:       cachesim.c
         $(CC) -c -o cachesim.o cachesim.c $(CFLAGS)

(等)因为目标是

cachesim
但配方(命令行)构建文件
cachesim.o

您的 makefile 可以像这样轻松编写(利用 make 的内置规则):

CC      = gcc
CFLAGS  = -Wall -m32 -O -g
LDFLAGS = -m32 -O -g

cachesim: cachesim.o cache.o trace_file_parser.o

clean:
        rm -f *.o

这就是您所需要的。

至于你的错误,在我看来,文件

cachesim.o
一定是某种奇怪的格式,也许是在你正确设置makefile之前。

如果您再次运行

make clean
,然后再次运行
make
,您是否会收到相同的错误? 如果是这样,请显示编译和链接行。

ETA:如果您想创建 32 位程序,请在链接行和编译行上使用

-m32
标志。

© www.soinside.com 2019 - 2024. All rights reserved.