linux编译32位的参数,【gcc参数和DEBUG条件编译】GCC的debug、release、32位版与64位版编译...

GCC 64 32位版与64位版、debug版与release版

http://blog.csdn.net/holandstone/article/details/7956109

为了适应现在越来越流行的64位系统,经常需要将代码分别编译为32位版和64位版。其次,除了需要生成debug版用于开发测试外,还需要生成release版用于发布。本文介绍了如何利用makefile条件编译来生成这些版本,而且不仅兼容Linux下的GCC,还支持MinGW、TDM-GCC等Windows下的GCC编译器。

一、C程序代码

为了测试条件编译的效果,以下面这个C语言程序为例(gcc64_make.c)——

C++ Code

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

#include#include// 获取程序位数(被编译为多少位的代码)intGetProgramBits()

{returnsizeof(int*) *8;

}intmain(intargc,char* argv[])

{

printf("bits:\t%d\n", GetProgramBits());

assert( argc>1);return0;

}

main函数中,前两条语句的含义为——

第一条语句用于显示当前程序的位数。如果编译为32位版,将会显示“bits: 32”;如果编译为64位版,将会显示“bits:

64”。

第二条语句是一条断言,需要argc变量大于1。如果编译为debug版,若运行时未加命令参数,该断言失败,于是输出错误信息并终止程序;如果编译为release版,所有断言被屏蔽,不会有错误信息。

二、GCC命令行参数

复习一下GCC命令行参数,看看各个版本的区别——

32位版:加上 -m32 参数,生成32位的代码。

64位版:加上 -m64 参数,生成64位的代码。

debug版:加上 -g 参数,生成调试信息。

release版:加上 -static 参数,进行静态链接,使程序不再依赖动态库。加上 -O3

参数,进行最快速度优化。加上-DNDEBUG参数,定义NDEBUG宏,屏蔽断言。

当没有-m32或-m64参数时,一般情况下会生成跟操作系统位数一致的代码,但某些编译器存在例外,例如——

32位Linux下的GCC,默认是编译为32位代码。

64位Linux下的GCC,默认是编译为64位代码。

Window系统下的MinGW,总是编译为32位代码。因为MinGW只支持32位代码。

Window系统下的MinGW-w64(例如安装了TDM-GCC,选择MinGW-w64),默认是编译为64位代码,包括在32位的Windows系统下。

三、makefile代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

# flags

CC = gcc

CFLAGS = -Wall

LFLAGS = # args

RELEASE =0BITS =

# [args] 生成模式. 0代表debug模式, 1代表release模式. make RELEASE=1.

ifeq ($(RELEASE),0)

# debug

CFLAGS += -gelse# release

CFLAGS += -static-O3 -DNDEBUG

LFLAGS += -staticendif

# [args] 程序位数. 32代表32位程序, 64代表64位程序, 其他默认. make BITS=32.

ifeq ($(BITS),32)

CFLAGS += -m32

LFLAGS += -m32elseifeq ($(BITS),64)

CFLAGS += -m64

LFLAGS += -m64elseendif

endif

.PHONY : all clean

# files

TARGETS = gcc64_make

OBJS = gcc64_make.o

all : $(TARGETS)

gcc64_make : $(OBJS)

$(CC) $(LFLAGS) -o $@ $^

gcc64_make.o : gcc64_make.c

$(CC) $(CFLAGS) -c $<

clean :

rm -f $(OBJS) $(TARGETS) $(addsuffix .exe,$(TARGETS))

为了控制条件编译,定义了RELEASE、BITS这两个变量,分别赋初值。然后用ifeq判断RELEASE、BITS变量的值,分别加上不同的参数。

因赋有初值,直接执行“make”时,编译得到的是默认位数的debug版。

若在执行make时给变量赋值,将会得到不同的版本——

make RELEASE=0:(默认位数的)debug版。

make RELEASE=1:(默认位数的)release版。

make BITS=32:32位(的debug)版。

make BITS=64:64位(的debug)版。

make RELEASE=0 BITS=32:32位的debug版。

make RELEASE=0 BITS=64:64位的debug版。

make RELEASE=1 BITS=32:32位的release版。

make RELEASE=1 BITS=64:64位的release版。

该makefile的代码风格是精心设计的,可以很方便的扩展——

需要增加代码文件或依赖关系时,修改“# files”之后的内容。

需要调整编译参数时,修改前半部分的参数变量。

需要增加新的条件编译参数时,在“# args”定义一个变量并赋初值,然后再在后面用“ifeq”判断变量来调整编译参数。

最后的“rm -f $(OBJS) $(TARGETS) $(addsuffix

.exe,$(TARGETS))”是为了兼容MinGW、TDM-GCC等Windows下的GCC编译器而设计的——

装好MSYS,再配置一下PATH环境变量,Windows中也可以使用rm命令删除文件。

因Windows下的可执行文件的扩展名是exe,所以使用了addsuffix函数增加“.exe”扩展名。

因Linux下不会生成.exe可执行文件,而Windows下不会生成无扩展名的可执行文件,导致rm会因找不到文件而报错。这时可以加上-f参数忽略该错误。

四、测试结果

4.1 Fedora 17 64位版下的 GCC 4.7.0

打开终端,使用cd命令进入程序所在目录,并执行以下命令——

C++ Code

1

2

3

4

5

6

7

8

9

10

11

12

13

make clean

make

./gcc64_make

make clean

make RELEASE=1./gcc64_make

make clean

make BITS=32./gcc64_make

make clean

make RELEASE=1BITS=32./gcc64_make

gcc --version

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值