我正在尝试使用-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答案 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.o
和GNU 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一步编译和链接你的代码,所有相关的标志和选项不仅会传递给编译器,还会传递给链接器。)