加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2018-01-16 14:18:52)
分类: 编译器

利用gcc的 -DDEBUG选项。

1. 源文件
DEBUG.c中有:
#include
int main(int argc, char *argv[])
{
#ifdef DEBUG
    printf("DEBUG is definded \n");
#else
    printf("DEBUG is not definded \n");
#endif
}
2. Makefile文件为:
DEBUG=
CFLAG= -g
debug: DEBUG.c
     gcc $(DEBUG) $(CFLAG) -o $@ $^

3. 输入:gcc -g -o debug DEBUG.c
               ./debug
   out: DEBUG is not definded
4. 输入:gcc -DDEBUG -g -o debug DEBUG.c
              ./debug
   out: DEBUG is definded

这样 DEBUG版本和 release版本都有了.
http://blog.csdn.net/blaider/article/details/7043444


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 

// 获取程序位数(被编译为多少位的代码)
int GetProgramBits()
{
    
return sizeof(int*) 8;
}

int main(int argc, charargv[])
{
    printf(
"bits:\t%d\n"GetProgramBits());
    assert( argc>
1 );
    
return 0;
}

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 =0
BITS =

[args] 生成模式. 0代表debug模式, 1代表release模式. make RELEASE=
1.
ifeq ($(RELEASE),
0)
    debug
    CFLAGS += -g
else
    release
    CFLAGS += -
static -O3 -DNDEBUG
    LFLAGS += -
static
endif

[args] 程序位数. 32代表32位程序, 64代表64位程序, 其他默认. make BITS=
32.
ifeq ($(BITS),
32)
    CFLAGS += -m32
    LFLAGS += -m32
else
    ifeq ($(BITS),
64)
        CFLAGS += -m64
        LFLAGS += -m64
    
else
    endif
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 $<<br>

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=
1 BITS=32
./gcc64_make
gcc --version


参考文献——
《跟我一起写 Makefile》. 陈皓. http://blog.csdn.net/haoel/article/details/2886
《Makefile条件编译debug版和release版》. 功夫Panda. http://www.cnblogs.com/caosiyang/archive/2012/06/13/2548051.html
《assert()函数用法总结》. Glroy. http://www.cnblogs.com/ggzss/archive/2011/08/18/2145017.html
《Windows版GCC之TDM-GCC 4.5.2》. 单鱼游弋. http://www.cnblogs.com/wxxweb/archive/2011/05/30/2063434.html


源码下载—— 
http://files.cnblogs.com/zyl910/gcc64_make.rar

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有