我正在尝试使用-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
你的错误是你没有传递-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 一步编译和链接您的代码,所有相关标志和选项不仅会传递给编译器,还会传递给链接器。)
| 归档时间: |
|
| 查看次数: |
13413 次 |
| 最近记录: |