GCC 64位程序的makefile条件编译

上传人:野鹰 文档编号:2989082 上传时间:2017-07-29 格式:PDF 页数:8 大小:472.56KB
返回 下载 相关 举报
GCC 64位程序的makefile条件编译_第1页
第1页 / 共8页
GCC 64位程序的makefile条件编译_第2页
第2页 / 共8页
GCC 64位程序的makefile条件编译_第3页
第3页 / 共8页
GCC 64位程序的makefile条件编译_第4页
第4页 / 共8页
GCC 64位程序的makefile条件编译_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《GCC 64位程序的makefile条件编译》由会员分享,可在线阅读,更多相关《GCC 64位程序的makefile条件编译(8页珍藏版)》请在金锄头文库上搜索。

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

2、gcc64_make.c) #include #include / 获取 程序位数(被编译为多少位的代码) int GetProgramBits() return sizeof(int*) * 8; int main(int argc, char* argv) printf(bits:t%dn, GetProgramBits(); assert( argc1 ); return 0; main 函数中,前两条语句的含义为 第一条语句用于显示当前程序的位数。如果编译为 32 位版,将会显示 “bits: 32”;如果编译 为 64 位版,将会显示 “bits: 64”。 第二条语句是一条断言,需

3、要 argc 变量大于 1。如果编译为 debug 版,若运行时未加命令参数,该断言失败,于是输出错误信息并终止程序;如果编译为 release 版,所有断言被屏蔽,不会有错误信息。 二、 GCC 命令行参数 复习一下 GCC 命令行参数,看看各个版本的区别 32 位版:加上 -m32 参数,生成 32 位的代码。 64 位版:加上 -m64 参数,生成 64 位的代码。 debug 版:加上 -g 参数,生成调试信息。 release 版:加上 -static 参 数,进行静态链接,使程序不再依赖动态库。加上 -O3 参数,进行最快速度优化。加上 -DNDEBUG 参数,定义 NDEBUG

4、宏,屏蔽断言。 当没有 -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 代码 makefile 的代码为 # f

5、lags 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.

6、 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 $ cle

7、an : 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)版。

8、 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”之后的内容。 需要调整编译参数时,修改前半部分的参数变量。 需要增加新的条件编译参数时,在“ # a

9、rgs”定义一个变量并赋初值,然后再在后面用“ ifeq”判断变量来调整编译参数。 最后的“ rm -f $(OBJS) $(TARGETS) $(addsuffix .exe,$(TARGETS)”是为了兼容 MinGW、TDM-GCC 等 Windows 下的 GCC 编译器而设计的 装好 MSYS,再配置一下 PATH 环境变量, Windows 中也可以使用 rm 命令 删除文件。 因 Windows 下的可执行文件的扩展名是 exe,所以使用了 addsuffix 函数增加“ .exe”扩展名。 因 Linux 下不会生成 .exe 可执行文件,而 Windows 下不会生成无扩展名

10、的可执行文件,导致 rm 会因找不到文件而报错。这时可以加上 -f 参数忽略该错误。 四、测试结果 4.1 Fedora 17 64 位版下的 GCC 4.7.0 打开终端,使用 cd 命令进入程序所在目录,并执行以下命令 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 运行结果 4.2 Windows XP SP3

11、 32 位版下的 GCC 4.6.2( MinGW (20120426)) 打开命令提示符,使用 cd 命令进入程序所在目录,并执行以下命令 make clean make gcc64_make make clean make RELEASE=1 gcc64_make make clean make BITS=64 gcc -version 运行结果 4.3 Windows 7 SP1 64 位版下的 GCC 4.6.1( TDM-GCC (MinGW-w64)) 打开命令提示符,使用 cd 命令进入程序所在目录,并 执行以下命令 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 运行结果

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号