使用make编译为32位

Fin*_*fin 1 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
Run Code Online (Sandbox Code Playgroud)

我收到的错误如下

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
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我这是什么意思吗?我该如何解决?

至于代码,除了打印'hello world'之外,代码没有任何关系

我在Linux 2.6.35 64位下使用GCC 4.4.3

zak*_*kak 8

你的错误是你没有传递-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
Run Code Online (Sandbox Code Playgroud)

更好的方法是Makefile:

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

.INTERMEDIATE: main.o

all: main

main: main.o

clean: 
    -rm main
Run Code Online (Sandbox Code Playgroud)

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

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


小智 5

您还应该通知链接器架构为 32 位。尝试添加

LD = $(CC)
LDFLAGS = -m32
Run Code Online (Sandbox Code Playgroud)

到您的 Makefile 并更改

$(CC) -o main main.o
Run Code Online (Sandbox Code Playgroud)

$(LD) $(LDFLAGS) -o main $^
Run Code Online (Sandbox Code Playgroud)

它应该工作。

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