【问题标题】:How can I compile a 32 bit program using a makefile如何使用 makefile 编译 32 位程序
【发布时间】: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 正在运行什么指令,我理解为什么会发生错误,但我不明白为什么它运行这些指令而不是我的

标签: c++ c makefile


【解决方案1】:

我建议将您的 makefile 视为代码(因为它是)并遵循标准建议以避免重复。

看起来你的标志也有点错误。 -m32 是编译器标志。 -ldl 是一个链接器标志。如果要构建 32 位文件,则需要告诉编译器和链接器构建 32 位文件。不能保证,但我认为你想要这个一般订单上的东西:

CFLAGS = -m32
LFLAGS = -melf_i386 -ldl

mem_1: mem_1.o memlayout.o
    $(LD) $(LFLAGS) -o mem_1 mem_1.o memlayout.o

mem_2: mem_2.o memlayout.o
    $(LD) $(LFLAGS) -o mem_2 mem_2.o memlayout.o

mem_3: mem_3.o memlayout.o
    $(LD) $(LFLAGS) -o mem_3 mem_3.o memlayout.o

# You probably don't really need this--`make` will usually have it built-in:
.c.o:
    $(CC) -c $(CFLAGS) $<

注意:我老了,所以这是一种老式的 Makefile。 Gnu 建议做一些不同的事情,但这应该仍然有效。

【讨论】:

    猜你喜欢
    • 2013-05-19
    • 1970-01-01
    • 2014-07-01
    • 2011-08-14
    • 2021-05-16
    • 2013-12-02
    • 1970-01-01
    • 2020-11-25
    • 1970-01-01
    相关资源
    最近更新 更多