4

我正在尝试使用 -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

4

2 回答 2

11

您的错误是您没有传递-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.o并将使用as 参数为您GNU Make调用链接器,因为它使用as 参数调用编译器LDFLAGSCFLAGSmain.o

“.INTERMEDIATE 所依赖的目标被视为中间文件。请参阅隐式规则链部分。没有依赖关系的 .INTERMEDIATE 将 makefile 中提到的所有文件目标标记为中间文件。” 特殊的内置目标名称

于 2012-10-19T20:47:35.823 回答
5

您还应该通知链接器有关 32 位架构的信息。尝试添加

LD = $(CC)
LDFLAGS = -m32

到您的 Makefile 并更改

$(CC) -o main main.o

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

它应该工作。

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

于 2012-10-19T20:33:10.073 回答