【发布时间】:2021-05-09 10:59:54
【问题描述】:
我正在尝试制作 3 个单独的程序 mem_1.exe、mem_2.exe 和 mem_3.exe。当我编译它们时,我需要将它们设为 32 位,并且错误消息似乎没有反映我正在写的内容。下面是我的makefile。
mem_1: memlayout.o mem_1.o
gcc -o mem_1 memlayout.c mem_1.c -ldl -m32
mem_2: memlayout.o mem_2.o
gcc -o mem_2 memlayout.c mem_2.c -m32 -ldl
mem_3: memlayout.o mem_3.o
gcc -o mem_3 memlayout.c mem_3.c -m32 -ldl
mem_1.o: mem_1.c
gcc -c -o mem_1 mem_1.c -m32
mem_2.o: mem_2.c
gcc -c -o mem_2 mem_2.c -m32
mem_3.o: mem_3.c
gcc -c -o mem_3 mem_3.c -m32
memlayout.o: memlayout.c
gcc -c -o memlayout memlayout.c -m32
clean:
rm -f mem_1.o mem_2.o mem_3.o memlayout.o *~
每次我尝试运行此 makefile 时都会收到此错误消息
cc -c -o memlayout.o memlayout.c
cc -c -o mem_1.o mem_1.c
gcc -o mem_1.exe mem_1.o memlayout.o -m32 -ldl
/usr/bin/ld: i386:x86-64 architecture of input file `mem_1.o' is incompatible with i386 output
/usr/bin/ld: i386:x86-64 architecture of input file `memlayout.o' is incompatible with i386 output
这似乎没有意义,因为我使用 -m32 标志使其成为 32 位。谁能解释我做错了什么?
【问题讨论】:
-
从输出中可以看到,
.o文件是在没有-m32的情况下构建的 -
mem_1.o不应将memlayout.o作为依赖项,对于 2 和 3 也是如此;在gcc -c行上给出两个.c文件是不正确的。所有.o规则都对 gcc 的调用非常不正确 -
@M.M 为什么会这样呢?为什么它不使用我的目标文件配方?
-
您可以使用
make --trace跟踪以查看发生了什么 -
@MM
:更新目标“memlayout.o”由于:memlayout.c cc -c -o memlayout.o memlayout.c :更新目标“mem_1.o”由于to: mem_1.c cc -c -o mem_1.o mem_1.c 我的跟踪显示了这一点。但我还是不明白这不是我给它的食谱。鉴于 make 正在运行什么指令,我理解为什么会发生错误,但我不明白为什么它运行这些指令而不是我的