资源预览内容
第1页 / 共8页
第2页 / 共8页
第3页 / 共8页
第4页 / 共8页
第5页 / 共8页
第6页 / 共8页
第7页 / 共8页
第8页 / 共8页
亲,该文档总共8页全部预览完了,如果喜欢就下载吧!
资源描述
GCC 64GCC 64 位程序的位程序的 makefilemakefile 条件编译条件编译 3232 位版与位版与 6464 位版、位版、 debugdebug 版与版与 releaserelease 版版 (兼容(兼容 MinGWMinGW、TDMTDM- -GCCGCC) 为了适应现在越来越流行的64位系统, 经常需要将代码分别编译为32位版和64位版。其次,除了需要生成 debug 版用于开发测试外,还需要生成 release 版用于发布。本文介绍了如何利用makefile条件编译来生成这些版本, 而且不仅兼容Linux下的GCC, 还支持MinGW、TDM-GCC 等 Windows 下的 GCC 编译器。 一、一、C C 程序代码程序代码 为了测试条件编译的效果,以下面这个 C 语言程序为例(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”。 第二条语句是一条断言,需要 argc 变量大于 1。如果编译为 debug 版,若运行时未加命令参数, 该断言失败, 于是输出错误信息并终止程序; 如果编译为 release 版,所有断言被屏蔽,不会有错误信息。 二、二、GCCGCC 命令行参数命令行参数 复习一下 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 系统下。 三、三、makefilemakefile 代码代码 makefile 的代码为 # 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 $ 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 644.1 Fedora 17 64 位版下的位版下的 GCC 4.7.0GCC 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 324.2 Windows XP SP3 32 位版下的位版下的 GCC 4.6.2GCC 4.6.2(MinGW (20120426)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 644.3 Windows 7 SP1 64 位版下的位版下的 GCC 4.6.1GCC 4.6.1(TDMTDM- -GCC (MinGWGCC (MinGW- -w64)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 运行结果
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号