使用make编译为32位

时间:2012-10-19 20:31:15

标签: c x86 makefile

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

2 个答案:

答案 0 :(得分:7)

您的错误是您没有将-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.oGNU Make将调用链接器LDFLAGS作为参数,因为它使用{{1}调用编译器}作为CFLAGS

的参数

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

答案 1 :(得分:3)

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

LD = $(CC)
LDFLAGS = -m32

到您的Makefile并更改

$(CC) -o main main.o

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

并且它应该工作。

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