GCC 64位程序的makefile条件编译心得——32位版与64位版、debug版与release版(兼容MinGW、TDM-GCC)

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


一、C程序代码

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

复制代码
#include <stdio.h>
#include <assert.h>

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

int main(int argc, char* argv[])
{
    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代码

  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 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 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
复制代码

 

  运行结果——

 

 

参考文献——
《跟我一起写 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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Matlab 2021b是MathWorks公司推出的最新一Matlab软件,是一款面向科学计算和工程应用的计算机软件,广泛应用于学术研究和工业设计开发领域。该本进行了针对性的优化和改进,增加了许多新的功能和工具,更加方便用户操作和提高了计算效率。 TDMinGW-gcc-64是Matlab常用的C语言编译器,是基于MinGW-w64开发的Windows上的GCC工具链。它能够支持C、C++和Fortran等多种语言的编译,并且生成高效的可执行文件。由于Matlab支持C语言接口,所以TDMinGW-gcc-64被广泛用于Matlab中的MEX文件的编译过程中,以达到增加功能和优化程序效率的目的。 因此,对于需要进行科学计算和工程设计开发的用户而言,安装Matlab 2021b和TDMinGW-gcc-64编译器是非常有必要的,它们能够满足用户的需求并且提高工作效率,是不可或缺的工具。同时,随着科技的不断进步和需求的增加,Matlab和TDMinGW-gcc-64也会继续升级和优化,为用户带来更加完善的体验和应用。 ### 回答2: Matlab 2021b TDM-GCC-64本是一款非常实用的软件工具,主要用于数值计算、数据分析以及绘图等方面,特别适用于工程学科领域的各个分支。这个本结合了Matlab的强大功能和TDM-GCC-64编译器的高速计算性能,能够有效提高研究人员和工程师在科学计算和模型建立方面的工作效率。 Matlab 2021b TDM-GCC-64本的主要功能有以下几个方面: 1. 高效的C++编译器:TDM-GCC-64编译器具有高效的计算速度和较高的性能,使得Matlab能够更加快速地处理大规模数据和运算计算,提高了Matlab的运行效率和工作效率。此外,TDM-GCC-64编译器还支持多线程并行计算,能够进一步优化Matlab的计算性能。 2. 数值计算和数据分析:Matlab 2021b TDM-GCC-64本内置有丰富的数学计算、统计分析和数据可视化工具,能够快速高效地处理各种数学模型和数据集,支持从数据采集到分析、可视化和报告输出的整个过程。 3. 功能强大的编程环境:Matlab 2021b TDM-GCC-64本提供了一套完整的编程环境,包括强大的脚本编辑器、可视化编程工具和调试器,可以让用户快速有效地进行算法设计和开发。 4. 插件拓展和应用:Matlab 2021b TDM-GCC-64本还支持各种插件拓展和应用,包括各种工具箱、函数库和第三方应用程序,能够为用户提供更加多样化和丰富的使用体验和功能支持。 总之,Matlab 2021b TDM-GCC-64本是一款非常实用和强大的软件工具,对于各个研究领域和工程学科都具有广泛的适用性和价值,可以帮助用户更好地完成科学计算、数据分析和模型建立等方面的工作。 ### 回答3: MATLAB 2021b是MATLAB的最新本,具有许多新功能和改进的性能。其中,支持的编译器之一是TDM-GCC-64本。 TDM-GCC-64是一个基于MinGW-w64构建的完全免费的C/C++编译器。它可用于Windows 64位操作系统,支持x86和x86_64架构,是使用GCC(GNU Compiler Collection)的一种选择。 与早期本的TDM-GCC在MATLAB中集成不同,MATLAB 2021b自带TDM-GCC-64编译器。这意味着MATLAB用户无需另外下载和安装此编译器即可使用它来支持C/C++编程。在MATLAB中,用户可以通过编写mex函数(MATLAB执行文件)来调用C/C++代码来扩展MATLAB的功能。 TDM-GCC-64还支持许多其他的C/C++库和工具,如OpenMP,这可以在使用MATLAB进行并行计算时提高性能。另外,TDM-GCC-64对新的C++标准(例如C++14和C++17)的支持也更好。 总之,MATLAB 2021b中集成的TDM-GCC-64本是一个强大的编译器,提供了许多有用的功能和性能改进。对于MATLAB用户,这可以使C/C++编程更加简单和方便。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值