【问题标题】:Compiling to 32-bit using make使用 make 编译为 32 位
【发布时间】:2012-10-19 20:31:14
【问题描述】:

我正在尝试使用 -m32 标志编译一个非常简单的程序。
如果我尝试使用 gcc -m32 执行此操作,它工作得很好(我有所需的库)

然而,当我将此标志添加到 makefile 中的标志时,我收到一个奇怪的错误
这是我的makefile

CC=gcc
CFLAGS=-m32 -O1 -W -Wall -pedantic -std=c99

all: main.o 
    $(CC) -o main main.o 
    rm main.o 

clean: 
    rm main

我收到的错误如下

gcc -o main main.o
/usr/bin/ld: i386 architecture of input file `main.o' is incompatible with i386:x86-64 output
collect2: ld returned 1 exit status
make: *** [all] Error 1

谁能告诉我这是什么意思?我该如何解决?

至于代码,代码除了打印'hello world'之外什么都不做

我在 Linux 2.6.35 64 位下使用 GCC 4.4.3

【问题讨论】:

  • 能把编译main.c的那一行加到main.o吗?
  • @TomAhh: make 有一个implicit rule 用于从.c 文件编译.o 文件
  • @AdamRosenfield 哦。好的,那对不起。 :)
  • 既然是靠隐式规则来制作main.o,为什么不也用隐式规则来制作main呢?您没有通过$(CFLAGS),但隐式规则会这样做。使用隐式规则。
  • @zakkak 如果没有明确给出规则,则将使用单个后缀规则.c,它同时使用:$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $<

标签: c x86 makefile


【解决方案1】:

您的错误是您没有将-m32 传递给链接器。

您实际上需要将您的 Makefile 更改为如下所示:

CC=gcc
CFLAGS=-m32 -O1 -W -Wall -pedantic -std=c99
LDFLAGS = -m32

all: main.o 
    $(CC) $(LDFLAGS) -o main main.o 
    rm main.o 

clean: 
    rm main

更好的方法是Makefile

CC=gcc
CFLAGS=-m32 -O1 -W -Wall -pedantic -std=c99
LDFLAGS=-m32

.INTERMEDIATE: main.o

all: main

main: main.o

clean: 
    -rm main

在后面你只是说 main 依赖于 main.oGNU Make 将调用链接器并将 LDFLAGS 作为参数为你调用,因为它使用 CFLAGS 作为参数调用编译器 main.o

“.INTERMEDIATE 所依赖的目标被视为中间文件。请参阅隐式规则链部分。没有依赖关系的 .INTERMEDIATE 将 makefile 中提到的所有文件目标标记为中间文件。” Special Built-in Target Names

【讨论】:

  • 感谢您的回答。虽然您能简单地向我解释一下 .INTERMEDIATE: 语句的作用吗?
  • 哦,nvm,我想我明白了。 :D 它负责在编译/链接完成后删除 .o 文件,对吧?
  • 是的,它实际上告诉make 哪些文件(在make 执行期间生成的文件中)不需要并且可以删除。在某些情况下,make 会删除一些认为它们是中间文件而您想要/需要它们的文件。在这种情况下,您可以使用 .SECONDARY 告诉 `make 不要删除此文件。看看我在答案中提供的链接。
【解决方案2】:

您还应该告知链接器该架构是 32 位的。尝试添加

LD = $(CC)
LDFLAGS = -m32

到您的 Makefile 并更改

$(CC) -o main main.o

$(LD) $(LDFLAGS) -o main $^

它应该可以工作。

(为什么有效?如果您使用 GCC 一步编译和链接代码,所有相关标志和选项不仅会传递给编译器,还会传递给链接器。)

【讨论】:

  • 实际上它不起作用,因为在他的 Makefile 中他没有将 LDFLAGS 传递给链接器。
  • @zakkak 其实是他的错 :)
  • 是的,但这并没有让你的答案正确;)很好,你修好了;)
猜你喜欢
  • 2011-03-30
  • 2018-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-25
  • 2017-06-09
  • 1970-01-01
  • 2014-01-12
相关资源
最近更新 更多