搜档网
当前位置:搜档网 › 课题_GCC 64位程序的makefile条件编译心得——32位版与64位版、debug版与release版(兼容MinGW、TDM-

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

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

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

容MinGW、TDM-

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

一、C程序代码

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

#include

#include

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

int GetProgramBits()

{

return sizeof(int*) * 8;

}

int main(int argc, 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代码

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》. 陈皓.

《Makefile条件编译debug版和release版》. 功夫Panda. 《asse r t()函数用法总结》. Glroy.

《Windows版GCC之TDM-GCC 4.5.2》. 单鱼游弋.

gcc编译器使用简明指南

gcc编译器使用简明指南 gcc对文件的处理需要经过预处理->编译->汇编->链接的步骤,从而产生一个可执行文件,各部分对应不同的文件类型,具体如下: file.c c程序源文件 file.i c程序预处理后文件 file.cxx c++程序源文件,也可以是https://www.sodocs.net/doc/873624629.html, / file.cpp / file.c++ file.ii c++程序预处理后文件 file.h c/c++头文件 file.s 汇编程序文件 file.o 目标代码文件 gcc [选项]文件列表 -ansi 强制完全ANSI一致 -c 仅编译或汇编,生成目标代码文件,将.c、.i、.s等文件生成.o文件,其余文件被忽略 -S 仅编译,不进行汇编和链接,将.c、.i等文件生成.s文件,其余文件被忽略 -E 仅预处理,并发送预处理后的.i文件到标准输出,其余文件被忽略 -o file 创建可执行文件并保存在file中,而不是默认文件a.out -g 产生用于调试和排错的扩展符号表,用于GDB调试,切记-g和-O通常不能一起使用 -w 取消所有警告 -W 给出更详细的警告 -O [num]优化,可以指定0-3作为优化级别,级别0表示没有优化 -x language 默认为-x none,即依靠后缀名确定文件类型,加上-x lan确定后面所有文件类型,直到下一个-x出现为止 -D macro[=]类似于源程序里的#define,在-D macro中的macro可被源程序识别,例如gcc -D NUM -D FILE=\"bbs.txt\" hello.c -o hello,第一个-D选项定义宏NUM,在程序中可以使用#ifdef来检查是否被设置,第二个-D定义宏FILE,在源程序中可用 -U macro 类似于源程序开头定义#undef macro,也就是取消源程序中的某个宏定义

16位、32位和64位操作系统的区别

16位、32位和64位操作系统的区别 我们这里先讲32bit与64bit系统的区别: 大体上来讲,64位的系统比32位的系统计算处理能力更精确更加强.-----------用计算器计算时有64位数字可以显示出来,而我们普通的32位系统最精确只能显示32个数字,这是一个小的区别.---------最主要的区别就是64位的XP需要你的CPU也是64位的.64位的技术比32位先进,但由于配套的相关的软硬件技术尚未成熟,很多情况下64位系统只能运行32位软件,现在的64位系统就象是一部跑车由于没有公路只能在农田里跑一样. --32位、64位代表的是使用cpu位数(64,32) 有时候人们怀疑一个系统的底层结构能否保证这个系统在被使用时达到安全而高效,64位版本的Windows 在这方面就比较完美。Windows XP和Windows Server 2003都是运行64位硬件的64位版本操作系统。64位Windows操作系统运行64位代码,同时通过使用WoW64 (Windows on Windows 64)也能运行32位代码。 你看,这并不是什么大问题,毕竟,32位版本的不同Windows操作系统都用来同时运行32位和16位代码。(技术上说,并不是同时运行,相关解释在以后的技巧中会展示给大家) 32位版本的Windows在如何允许32为和16位代码并肩运行方面有着很复杂的机制。然而,这个系统被设计成无论你是系统管理员还是临时用户,你都不需要知道这些机制如何运行。 但是64位版本的Windows就不同了。从一个用户的立场上看,64位应用程序和32位应用程序简单地同时运行,没有什么特殊的。但是对于一个管理员(和帮助桌面用户的人员)来说,这其中就有很大不同了:32位代码与64位代码相隔离。这个隔离是如此重要以至于64位版本的Windows有两个注册表,一个是针对64位,一个是针对32位。 尽管64位版本的Windows XP和Windows Server 2003看起来在操作时候和它们32位的版本几乎同样的,但是在表象之下其实是有很大不同的。如果你在64位版本的Windows下按照32位版本一样来执行某些程序,你可能引起一些麻烦。 --------- 16、32、64位是指cpu可寻址的长度。例如32位计算机,CPU可寻址的范围是0到2的32次方减1,也就是说内存最大可达2的32次方个字节,也就是4GB.

GCC常见错误解析

GCC常见错误解析 一、错误类型 第一类∶C语法错误 错误信息∶文件source.c中第n行有语法错误(syntex errror)。 这种类型的错误,一般都是C语言的语法错误,应该仔细检查源代码文件中第n行及该行之前的程序,有时也需要对该文件所包含的头文件进行检查。 有些情况下,一个很简单的语法错误,gcc会给出一大堆错误,此时要保持清醒的头脑,不要被其吓倒,必要的时候再参考一下C语言的基本教材。 第二类∶头文件错误 错误信息∶找不到头文件head.h(Can not find include file head.h)。 这类错误是源代码文件中的包含头文件有问题,可能的原因有头文件名错误、指定的头文件所在目录名错误等,也可能是错误地使用了双引号和尖括号。 第三类∶档案库错误 错误信息∶连接程序找不到所需的函数库,例如∶ld: -lm: No such file or directory. 这类错误是与目标文件相连接的函数库有错误,可能的原因是函数库名错误、指定的函数库所在目录名称错误等,检查的方法是使用find命令在可能的目录中寻找相应的函数库名,确定档案库及目录的名称并修改程序中及编译选项中的名称。第四类∶未定义符号 错误信息∶有未定义的符号(Undefined symbol)。 这类错误是在连接过程中出现的,可能有两种原因∶一是使用者自己定义的函数或者全局变量所在源代码文件,没有被编译、连接,或者干脆还没有定义,这需要使用者根据实际情况修改源程序,给出全局变量或者函数的定义体;二是未定义的符号是一个标准的库函数,在源程序中使用了该库函数,而连接过程中还没有给定相应的函数库的名称,或者是该档案库的目录名称有问题,这时需要使用档案库维护命令ar检查我们需要的库函数到底位于哪一个函数库中,确定之后,修改gcc 连接选项中的-l和-L项。 排除编译、连接过程中的错误,应该说这只是程序设计中最简单、最基本的一个步骤,可以说只是开了个头。这个过程中的错误,只是我们在使用C语言描述一个算法中所产生的错误,是比较容易排除的。我们写一个程序,到编译、连接通过为止,应该说刚刚开始,程序在运行过程中所出现的问题,是算法设计有问题,说得更玄点是对问题的认识和理解不够,还需要更加深入地测试、调试和修改。一个程序,稍为复杂的程序,往往要经过多次的编译、连接和测试、修改。 二、常见错误信息解析与处理 1

1、GCC编译器的使用

linux下gcc编译器的使用 1、文件后缀名 .c C 源程序 .C C++ 源程序 .cc C++ 源程序 .cxx C++ 源程序 .m Objective –C源程序 .i 预处理过的c源程序 .ii 预处理过的C++源程序 .s 组合语言源程序 .S 组合语言源程序 .h 头文件 .o 目标文件 .a 存档文件 2、GCC常用选项 -c 通知GCC取消链接步骤,即编译源码并在最后生成目标文件; -Dmacro定义指定的宏,使它能够通过源码中的#ifdef进行检验 #define -static 指定程序编译时采用静态编译的方法; -E 不经过编译预处理程序的输出而输送至标准输出; -g获得有关调试程序的详细信息,它不能与-o选项联合使用; -Idirectory在包含文件搜索路径的起点处添加指定目录; -llibrary提示链接程序在创建最终可执行文件时包含指定的库; -O、-O2、-O3将优化状态打开,该选项不能与-g选项联合使用; -S要求编译程序生成来自源代码的汇编程序输出; -v启动所有警报; -Wall发生警报时取消编译操作,即将警报看作是错误; -Werror在发生警报时取消编译操作,即把报警当作是错误; -w 禁止所有的报警。 目前Linux下最常用的C语言编译器是GCC(GNU Compiler Collection),它是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C++和Object C等语言编写的程序。GCC不仅功能非常强大,结构也异常灵活。最值得称道的一点就是它可以通过不同的前端模块来支持各种语言,如Java、 Fortran、Pascal、Modula-3和Ada等。开放、自由和灵活是Linux的魅力所在,而这一点在GCC上的体现就是程序员通过它能够更好地控制整个编译过程。

如何知道电脑安装win7时该装32位还是64位

如何知道电脑安装win7时该装32位还是64位? 64位与32位的区别(最近装了个64位的Win7,所以上来让大家知道知道) 64位与32位的区别 1.64bit CPU拥有更大的寻址能力,最大支持到16GB内存,而32bit只支持4G内存 2.64位CPU一次可提取64位数据,比32位提高了一倍,理论上性能会提升1倍。但这是建立在64bit操作系统,64bit软件的基础上的。 64位处理器之失 ※硬件———缺乏驱动程序,很多现有硬件无法使用 在目前的情况下,大部分厂商不会积极的开发64位Windows驱动,除非64位WindowsXP 已经在市场上较普及,或者拥有64位Windows驱动的产品的市场价格要高于普通产品。不管怎样,64位WindowsXP的用户都会在相当长的一段时间内缺少必要的驱动。目前,市场上仅有A TI全面推出了64位Windows的显卡驱动,而另一位显卡芯片巨头nVidia只推出了一部分产品的64位Windows驱动。即使是ATI的驱动,也有相当多的Bug,据用户反映兼容性和稳定性都有待提升。 其他硬件,例如声卡、SCSI卡、电视卡等很多设备,以及打印机、扫描仪等很多外设都因为缺少驱动程序而不能使用。这一点有些类似Windows2003刚刚推出的时候,只不过Windows2003因为也是32位架构,比较容易解决,有些设备强行使用WindowsXP的驱动即可,但是Windows64位版不能这样替代。加之按照惯例,普通厂商更新一次驱动的周期是两年,所以,在选择64位WindowsXP之前,你必须小心地避开这些“地雷”。 ※软件———操作系统不是问题,但是软件出现不兼容难题 微软已经正式推出了Windows64位版,这让很多担心64位系统无软件可用的人吃了一颗“定心丸”,但是事情并未简单的结束,仅有64位版本的Windows只解决了操作系统平台的问题,就好像已经铺好了高速公路,还需要很多专门为64位架构专门设计的“快车”软件在上面运行。很遗憾,目前专门为64位设计的应用软件凤毛麟角,就连微软公司的大部分软件都仍然是32位架构的,目前仅有MSSQL数据库等很少几种,而像流行的Office 软件都仍然没有为64位系统优化。 最难受的是,一些与硬件相关的软件,如宽带上网的客户端、掌上电脑及智能手机的桌面软件均有极大机会出现不兼容问题,这样您在64位的Windows下将无法宽带上网,或者无法同步您的手机或者掌上电脑。另一种,最容易出问题的软件就是防毒软件,基本上所有以前您买的32位防毒软件将没有一种可以在64位Windows使用,必需购买专门为64位设计的新版,目前市面上仅有寥寥几种,据悉微软也可能介入64位防毒市场,所以

GCC编译选项

Linux中gcc,g++常用编译选项 -x language filename 设定文件所使用的语言,使后缀名无效,对以后的多个有效.也就是根据约定,C语言的后缀名称是.c的,而C++的后缀名是.C或者.cpp,如果你很个性,决定你的C代码文件的后缀名是. pig 哈哈,那你就要用这个参数,这个参数对他后面的文件名都起作用,除非到了下一个参数的使用。可以使用的参数有下面的这些: `c', `objective-c', `c-header', `c++', `cpp-output', `assembler', and `a ssembler-with-cpp'. 看到英文,应该可以理解的。 例子用法: cd.. gcc -x c hello.pig -x none filename 关掉上一个选项,也就是让gcc根据文件名后缀,自动识别文件类型 例子用法: gcc -x c hello.pig -x none hello2.c -c 只激活预处理,编译,和汇编,也就是他只把程序做成obj文件 例子用法: gcc -c hello.c 他将生成.o的obj文件 -S 只激活预处理和编译,就是指把文件编译成为汇编代码。 例子用法 gcc -S hello.c 他将生成.s的汇编代码,你可以用文本编辑器察看 -E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面. 例子用法: gcc -E hello.c > pianoapan.txt gcc -E hello.c | more 慢慢看吧,一个hello word 也要预处理成800行的代码 -o 制定目标名称,缺省的时候,gcc 编译出来的文件是a.out,很难听,如果你和我有同感,改掉它,哈哈 例子用法 gcc -o hello.exe hello.c (哦,windows用习惯了) gcc -o hello.asm -S hello.c -pipe 使用管道代替编译中临时文件,在使用非gnu汇编工具的时候,可能有些问题 gcc -pipe -o hello.exe hello.c

谁知道 WIN7系统 32位和64位 有什么区别

谁知道WIN7系统32位和64位有什么区别? 最佳答案 简单的说x86代表32位操作系统x64代表64位操作系统。 如果你的CPU是双核以上,那肯定支持64位操作系统了 如果你的电脑内存大于4G,那就要用64位的系统了,因为32位的Windows 7也好,Vista也好,最大都只支持3.25G的内存。而64位的windows 7最大将支持128G的内存。 以下是引用网络上一段文字: 64bit计算主要有两大优点:可以进行更大范围的整数运算;可以支持更大的内存。 不能因为数字上的变化,而简单的认为64bit处理器的性能是32bit 处理器性能的两倍。实际上在32bit应用下,32bit处理器的性能甚至会更强,即使是64bit处理器,目前情况下也是在32bit应用下性能更强。所以要认清64bit处理器的优势,但不可迷信64bit。 更详细解答: 内存这是64位系统最显著的优点,它可以使用超过4GB的内存。大多数新的台式机和笔记本电脑至少拥有4GB的内存。问题是,像Vista和Win 7的32位版本只能够用大约3GB的内存。相比之

下,64位的Windows 不仅可以利用高达192GB的内存,还能够使用的内存映射取代BIOS的功能,从而使操作系统真正使用完整的 4GB的。因此,如果您安装Win7 x64,对于有的4GB内存的机器你不会浪费1GB内存。 个人认为,3GB不足够用于日常应用只是一个时间问题。一个例子是的Win 7的XP模式功能,它可以让你用旧的应用在一个虚拟机运行在Windows XP中。此功能可以用于各种目的,例如运行Office 2007和Office 2003年在同一台计算机上同时进行,或者是IE(对WEB开发很有用)。但WinXP模式需要至少512MB~1GB内存才能正常运行,因此XP模式非常吃内存。因此,如果您现在部署Windows 7 32位,那么你可能会很快要移动到64位,仅仅因为你必须升级您的机器与新的内存。我自己的笔记本电脑拥有8GB的内存,这是因为为了自己开发的程序在每个虚拟机环境下都能运行。我不想浪费内存中每一个字节。 64位真提供更好的性能了么? 我猜很多人认为64位处理器要快于32位处理器。因为有这样一个事实,从8位过渡到16位,从16位过渡到32位的过程确实带来了一些性能提升。基于以上的原因,是否可以认为64位的处理器可以更快?

arm-linux-gcc 常用参数讲解 gcc编译器使用方法

arm-linux-gcc常用参数讲解gcc编译器使用方法 我们需要编译出运行在ARM平台上的代码,所使用的交叉编译器为arm-linux-gcc。下面将arm-linux-gcc编译工具的一些常用命令参数介绍给大家。 在此之前首先介绍下编译器的工作过程,在使用GCC编译程序时,编译过程分为四个阶段: 1. 预处理(Pre-Processing) 2. 编译(Compiling) 3. 汇编(Assembling) 4. 链接(Linking) Linux程序员可以根据自己的需要让GCC在编译的任何阶段结束,以便检查或使用编译器在该阶段的输出信息,或者对最后生成的二进制文件进行控制,以便通过加入不同数量和种类的调试代码来为今后的调试做好准备。和其它常用的编译器一样,GCC也提供了灵活而强大的代码优化功能,利用它可以生成执行效率更高的代码。 以文件example.c为例说明它的用法 0. arm-linux-gcc -o example example.c 不加-c、-S、-E参数,编译器将执行预处理、编译、汇编、连接操作直接生成可执行代码。 -o参数用于指定输出的文件,输出文件名为example,如果不指定输出文件,则默认输出 a.out 1. arm-linux-gcc -c -o example.oexample.c -c参数将对源程序example.c进行预处理、编译、汇编操作,生成example.0文件 去掉指定输出选项"-o example.o"自动输出为example.o,所以说在这里-o加不加都可以 2.arm-linux-gcc -S -o example.sexample.c -S参数将对源程序example.c进行预处理、编译,生成example.s文件 -o选项同上 3.arm-linux-gcc -E -o example.iexample.c -E参数将对源程序example.c进行预处理,生成example.i文件(不同版本不一样,有的将预处理后的内容打印到屏幕上) 就是将#include,#define等进行文件插入及宏扩展等操作。 4.arm-linux-gcc -v -o example example.c 加上-v参数,显示编译时的详细信息,编译器的版本,编译过程等。 5.arm-linux-gcc -g -o example example.c -g选项,加入GDB能够使用的调试信息,使用GDB调试时比较方便。 6.arm-linux-gcc -Wall -o example example.c -Wall选项打开了所有需要注意的警告信息,像在声明之前就使用的函数,声明后却没有使用的变量等。 7.arm-linux-gcc -Ox -o example example.c -Ox使用优化选项,X的值为空、0、1、2、3 0为不优化,优化的目的是减少代码空间和提高执行效率等,但相应的编译过程时间将较长并占用较大的内存空间。 8.arm-linux-gcc -I /home/include -o example example.c -Idirname: 将dirname所指出的目录加入到程序头文件目录列表中。如果在预设系统及当前目录中没有找到需要的文件,就到指定的dirname目录中去寻找。 9.arm-linux-gcc -L /home/lib -o example example.c

最新GCC编译器选项及优化提示

G C C编译器选项及优 化提示

GCC编译器选项及优化提示 GCC编译器选项及优化提示2010-08-01 19:41很多弟兄可能都很关心如何优化编译自己的程序,虽然本人不赞成"骨灰"玩法,却也不得不承认这是掌握gcc的绝佳途径; 因此献上此帖,以供各位玩家参考,绝对原创噢 = 大多数程序和库在编译时默认的优化级别是"2"(使用gcc选项:"-O2")并且在Intel/AMD平台上默认按照i386处理器来编译。 如果你只想让编译出来的程序运行在特定的平台上,就需要执行更高级的编译器优化选项,以产生只能运行于特定平台的代码。 一种方法是修改每个源码包中的Makefile文件,在其中寻找CFLAGS和CXXFLAGS变量(C和C++编译器的编译选项)并修改它的值。 一些源码包比如binutils,gcc,glibc等等,在每个子文件夹中都有Makefile文件,这样修改起来就太累了! 另一种简易做法是设置CFLAGS和CXXFLAGS环境变量。大多数configure 脚本会使用这两个环境变量代替Makefile文件中的值。 但是少数configure脚本并不这样做,他们必须需要手动编辑才行。 为了设置CFLAGS和CXXFLAGS环境变量,你可以在bash中执行如下命令(也可以写进.bashrc以成为默认值): export CFLAGS="-O3-march="&&CXXFLAGS=$CFLAGS 这是一个确保能够在几乎所有平台上都能正常工作的最小设置。

"-march"选项表示为特定的cpu类型编译二进制代码(不能在更低级别的cpu上运行), Intel通常是: pentium2,pentium3,pentium3m,pentium4,pentium4m,pentium- m,prescott,nocona 说明:pentium3m/pentium4m是笔记本用的移动P3/P4;pentium-m是迅驰I/II代笔记本的cpu; prescott是带SSE3的P4(以滚烫到可以煎鸡蛋而闻名);nocona则是最新的带有EMT64(64位)的P4(同样可以煎鸡蛋) AMD通常是:k6,k6-2,k6-3,athlon,athlon-tbird,athlon-xp,athlon-mp,opteron,athlon64,athlon-fx 用AMD的一般都是DIYer,就不必解释了吧。 如果编译时没有抱怨"segmentation fault,core dumped",那么你设定的"-O"优化参数一般就没什么问题。 否则请降低优化级别("-O3"-"-O2"-"-O1"-取消)。 个人意见:服务器使用"-O2"就可以了,它是最安全的优化参数(集合);桌面可以使用"-O3"; 不鼓励使用过多的自定义优化选项,其实他们之间没什么明显的速度差异(有时"-O3"反而更慢)。 编译器对硬件非常敏感,特别是在使用较高的优化级别的时候,一丁点的内存错误都可能导致致命的失败。 所以在编译时请千万不要超频你的电脑(我编译关键程序时总是先降频然的)。

怎样查看计算机是32位还是64位操作系统

怎样查看计算机是32位还是64位操作系统 1.首先单击左下方的“开始”按钮,然后依次展开“控制面板—系 统” 2.这时出现了“查看有关计算机的基本信息”窗口,我们将滚动条拉到最下面,有一项 “系统类型”,如果你的系统是32位这里就会显示32位操作系统,如果是64位则会显示64位操作系统。

Windows xp 方法一: 1.在桌面上“我的电脑”鼠标右键单击“属性” 2.弹出了标题名为“系统属性”的窗口,在“常规”选项卡下记录您的系统是32位还是 64位的信息。如果您的系统是64位的,会明确标示出“x64 Edition”,否则您的系统就是32位 的。 方法二:

1.单击“开始”,然后单击“运 行” 2.在“打开”框中,键入,然后单击“确 定” 3.在“项目”下面的右窗格中找到“处理器”。注意数值。 4.如果“处理器”对应的值是以“x86”开头的,则该计算机正在运行的是 Windows 操作 系统的 32 位版本。

5.如果“处理器”对应的值是以“ia64”开头的,则该计算机正在运行的是 Windows 操 作系统的 64 位版本。 6.或者:在“系统摘要”右窗格中找到“系统类型” 7.如果显示“基于 X86 的PC”,则该计算机正在运行的是 Windows 操作系统的32位版 本; 8.如果为“基于 Itanium 的系统”,则该计算机正在运行的是 Windows 操作系统的64 位版本。 方法三:

1.开始>运行中键入“cmd”命令 2.然后在“命令提示符”窗口中输入“systeminfo”,按回车

3.如果您的系统是64位的,会在“OS 名称: Microsoft Windows XP Professional”一 行后明确标示出“x64 Edition”,否则您的系统就是32位的。 方法四: 1.开始>运行中输入“winver”(系统版本号命令)

vi编辑器及GCC编译器的使用

实验三vi编辑器及GCC编译器的使用 【实验目的】 一、掌握文本编辑器vi的使用方法 二、了解GNU gcc编译器 三、掌握使用GCC编译C语言程序的方法 【实验内容】 一、vi的三种工作模式: 1、命令模式:执行相关文本编辑命令 2、输入模式:输入文本 3、末行模式:实现查找、替换、保存、多文件操作等等功能 二、进入vi,直接在Shell提示符下键入vi [文件名称],如果该文件在当前目录不存在,则vi创建之。 三、退出vi 1、在命令模式下输入“:wq”,保存文件并退出vi 2、若不需要保存文件,输入“:q” 3、若文件已修改,但不保存,输入“:q!”强制退出vi 4、其它一些不常用的方法在此省略。 四、命令模式下的常用编辑命令 1、启动vi后,进入的是vi的命令模式 2、按i键,进入输入模式,可以进行文本的编辑,在输入模式下,按esc 键,可切换回命令模式 i:光标位置不变,可在光标左侧插入正文 a:光标位置向后退一格,可在光标左侧插入正文 o:在光标所在行的下一行增添新行 O:在光标所在行的上一行增添新行 I:光标跳到当前行的开头 A:光标跳到当前行的末尾 3、光标的移动 k、j、h、l分别等同于上、下、左、右箭头键 Ctrl+b,向上翻一页 Ctrl+f,向下翻一页 nH,将光标移到屏幕的第n行 nL,将光标移到屏幕的倒数第n行 4、删除文本 nX,删除光标所指向的前n个字符 D,删除光标右侧的所有字符(包括光标所指向的字符) db,删除光标左侧的全部字符 ndd,删除当前行和当前行以后的n行内容 5、粘贴和复制 p,将缓冲区的内容粘贴到当前字符的右侧

P,将缓冲区的内容粘贴到当前字符的左侧 yy,复制当前行到内存缓冲区 nyy,复制n行内容到内存缓冲区 6、搜索字符串 /str1,正向搜索字符串str1 n,继续搜索 ?str2,反向搜索字符串str2 7、撤销和重复 u,撤销前一条命令的执行结果 .,重复最后一条命令 五、末行模式下的命令 :n,将光标移动到第n行 :nw file,将第n行写入file文件 :n,mw file,将第n行至第m行写入file文件 :w,将编辑的内容写入原始文件 :wq,将编辑的内容写入原始文件并退出编辑程序 :w file,将编辑的内容写入file文件,保持原有文件的内容不变 :f file,将当前文件重命名为file :e file,编辑新文件file代替原有内容 :f,打印当前文件的状态,如文件的行数,光标所在的行号等 :!<命令>,执行相应shell命令 六、三种工作模式的切换 1、在Linux shell下,键入vi或vi <文件名>进入命令模式 2、在命令模式下,键入:进入末行模式 3、在命令模式下,键入文本编辑命令如i,a,o等进入文本输入模式 4、在文本输入模式下,按esc键进入命令模式 5、在末行模式下,按backspace键或del键进入命令模式 6、在末行模式下,键入q或wq,退出vi,饭后到Linux shell下 GCC编译器的使用 一、使用vi或其它文本编辑器,输入C语言程序,并保存为test.c 二、在Linux shell下,输入命令gcc –o test test.c 三、编译正确后,输入命令./test运行程序,观察程序运行结果 四、若编译错误,根据提示信息,进入程序查错,再回到第二步,直至程序 语法无误。 附:GCC使用方法和常用选项 使用GCC编译C程序生成可执行文件需要经历4个步骤: 1、预处理,这一步需要分析各种命令,如#define、#include、#ifdef 等。Gcc调用cpp程序来进行预处理 2、编译,这一步将根据输入文件产生汇编语言,gcc调用ccl进行编 译工作

gcc编译器 CFLAGS 标志参数说明

gcc编译器 CFLAGS 标志参数说明2012-11-14 15:10:28 分类:LINUX CFLAGS = -g -O2 -Wall -Werror -Wno-unused 编译出现警告性错误unused-but-set-variable,变量定义但没有使用,解决方法: 增加CFLAGS 或CPPFLAGS参数如下: CPPFLAGS=" -Werror -Wno-unused-but-set-variable" || exit 1 Gcc总体选项列表 后缀名所对应的语言 -S只是编译不汇编,生成汇编代码 -E只进行预编译,不做其他处理 -g在可执行程序中包含标准调试信息 -o file把输出文件输出到file里 -v打印出编译器内部编译各过程的命令行信息和编译器的版本 -I dir在头文件的搜索路径列表中添加dir目录 -L dir在库文件的搜索路径列表中添加dir目录 -static链接静态库 -llibrary连接名为library的库文件 ·“-I dir” 正如上表中所述,“-I dir”选项可以在头文件的搜索路径列表中添加dir目录。由于Linux 中头文件都默认放到了“/usr/include/”目录下,因此,当用户希望添加放置在其他位置的头文件时,就可以通过“-I dir”选项来指定,这样,Gcc就会到相应的位置查找对应的目录。 比如在“/root/workplace/Gcc”下有两个文件: #include int main() { printf(“Hello!!\n”); return 0; } #include

这样,就可在Gcc命令行中加入“-I”选项: [root@localhost Gcc] Gcc hello1.c –I /root/workplace/Gcc/ -o hello1 这样,Gcc就能够执行出正确结果。 小知识 在include语句中,“<>”表示在标准路径中搜索头文件,““”” 表示在本目录中搜索。故在上例中,可把hello1.c的“#include” 改为“#include “my.h””,就不需要加上“-I”选项了。 ·“-L dir” 选项“-L dir”的功能与“-I dir”类似,能够在库文件的搜索路径列表中添加dir目录。 例如有程序hello_sq.c需要用到目录“/root/workplace/Gcc/lib”下的一个动态库 libsunq.so,则只需键入如下命令即可: [root@localhost Gcc] Gcc hello_sq.c –L /root/workplace/Gcc/lib –lsunq –o hello_sq 需要注意的是,“-I dir”和“-L dir”都只是指定了路径,而没有指定文件,因此不能在 路径中包含文件名。 另外值得详细解释一下的是“-l”选项,它指示Gcc去连接库文件libsunq.so。由于在Linux 下的库文件命名时有一个规定:必须以lib三个字母开头。因此在用-l选项指定链接的库 文件名时可以省去lib三个字母。也就是说Gcc在对”-lsunq”进行处理时,会自动去链接 名为 libsunq.so的文件。 (2)告警和出错选项 Gcc的告警和出错选项如表3.8所示。 Gcc总体选项列表 选项含义 -ansi 支持符合ANSI标准的C程序 -pedantic 允许发出ANSI C标准所列的全部警告信息 -pedantic-error 允许发出ANSI C标准所列的全部错误信息 -w 关闭所有告警 -Wall 允许发出Gcc提供的所有有用的报警信息 -werror 把所有的告警信息转化为错误信息,并在告警发生时终止编译过程 下面结合实例对这几个告警和出错选项进行简单的讲解。 如有以下程序段: #include void main() { long long tmp = 1; printf(“This is a bad code!\n”);

32位操作系统运行快还是64位系统运行快

32位操作系统运行快还是64位系统运行快 关于32位操作系统运行快还是64位系统运行快这个问题,在问题的提法上本身就有问题。其实正确的问法应该是电脑系统装32位系统好还是64位系统好。下面小编就为大家介绍一下这个问题的具体解答吧,欢迎大家参考和学习。 这里有个重要的条件,就是硬件条件相同且都支持64位和内存足够,这是目前主流硬件的基本配置了。问题中的渲染一词在同等条件下仍然是程序运行速度的问题(需要排除依赖显卡的独立部分,因为在Windows 7上很多渲染工作已转交给GPU来完成),天缘下面的回答也必须要以这个为节点或条件。问题2的游戏载入速度同问题1中的渲染,还有个比较特殊的地方,就是还跟DIRECTX版本和驱动等相关,所以也必须规定软件条件必须相同,只有位上差异,故仍是哪个更快的问题。 一、计算机操作系统和软件角度 首先看操作系统和上层软件,无论64位OS还是64位软件都是必须按照64位格式进行编译,也就是默认的字长64位,运行时,除了一些特殊的独立计算,比如位运算,其它非标准字长变

量运行时都是需要进行转换的。32位也是一样,这一点还看不出来哪个优劣(只指速度),即使硬件条件相同,实际上还是有速度上的差异,那就看谁的格式转换最少,这就决定于应用程序的类型和设计方法了。 操作系统也是软件,我们再看一下编译后的文件大小,大家可以看一下Windows 7 64位版安装文件大小就知道了,肯定要比32位要大,这里问题就来了,同样一个个文件(打个比方),32位可能是1M,而64位的可能就是2M,那么从硬盘上读取就存在时间差异。所以文件大是个劣势。 到这里就可以看出不同版本OS或软件实际运行效率几乎相当(实际上程序的差异主要就是在类型转换上),速度因素主要决定于硬件,下面就来看一下硬件因素有哪些。

gcc编译器使用说明

要想读懂本文,你需要对C语言有基本的了解,本文将介绍如何使用gcc编译器。首先,我们介绍如何在命令行方式下使用编译器编译简单的C源代码。然后,我们简要介绍一下编译器究竟作了那些工作,以及如何控制编译过程。我们也简要介绍了调试器的使用方法。 GCC rules 你能想象使用封闭源代码的私有编译器编译自由软件吗?你怎么知道编译器在你的可执行文件中加入了什么?可能会加入各种后门和木马。Ken Thompson是一个著名的黑客,他编写了一个编译器,当编译器编译自己时,就在'login'程序中留下后门和永久的木马。请到这里阅读他对这个杰作的描述。幸运的是,我们有了gcc。当你进行 configure; make; make install 时, gcc在幕后做了很多繁重的工作。如何才能让gcc为我们工作呢?我们将开始编写一个纸牌游戏,不过我们只是为了演示编译器的功能,所以尽可能地精简了代码。我们将从头开始一步一步地做,以便理解编译过程,了解为了制作可执行文件需要做些什么,按什么顺序做。我们将看看如何编译C程序,以及如何使用编译选项让gcc按照我们的要求工作。步骤(以及所用工具)如下:预编译 (gcc -E),编译 (gcc),汇编 (as),和连接 (ld)。 开始... 首先,我们应该知道如何调用编译器。实际上,这很简单。我们将从那个著名的第一个C程序开始。(各位老前辈,请原谅我)。 #include int main() { printf("Hello World!\n"); } 把这个文件保存为 game.c。你可以在命令行下编译它: gcc game.c 在默认情况下,C编译器将生成一个名为 a.out 的可执行文件。你可以键入如下命令运行它:a.out Hello World 每一次编译程序时,新的 a.out 将覆盖原来的程序。你无法知道是哪个程序创建了 a.out。

GCC编译器选项及优化提示12页word

GCC编译器选项及优化提示 GCC编译器选项及优化提示2010-08-01 19:41很多弟兄可能都很关心如何优化编译自己的程序,虽然本人不赞成"骨灰"玩法,却也不得不承认这是掌握gcc的绝佳途径; 因此献上此帖,以供各位玩家参考,绝对原创噢 大多数程序和库在编译时默认的优化级别是"2"(使用gcc选项:"-O2")并且在Intel/AMD平台上默认按照i386处理器来编译。 如果你只想让编译出来的程序运行在特定的平台上,就需要执行更高级的编译器优化选项,以产生只能运行于特定平台的代码。 一种方法是修改每个源码包中的Makefile文件,在其中寻找CFLAGS和CXXFLAGS变量(C和C++编译器的编译选项)并修改它的值。 一些源码包比如binutils,gcc,glibc等等,在每个子文件夹中都有Makefile文件,这样修改起来就太累了! 另一种简易做法是设置CFLAGS和CXXFLAGS环境变量。大多数configure脚本会使用这两个环境变量代替Makefile文件中的值。 但是少数configure脚本并不这样做,他们必须需要手动编辑才行。 为了设置CFLAGS和CXXFLAGS环境变量,你可以在bash中执行如下命令(也可以写进.bashrc以成为默认值): export CFLAGS="-O3-march="&&CXXFLAGS=$CFLAGS 这是一个确保能够在几乎所有平台上都能正常工作的最小设置。 "-march"选项表示为特定的cpu类型编译二进制代码(不能在更低级别的cpu上运行), Intel通常是: pentium2,pentium3,pentium3m,pentium4,pentium4m,pentium- m,prescott,nocona 说明:pentium3m/pentium4m是笔记本用的移动P3/P4;pentium-m 是迅驰I/II代笔记本的cpu; prescott是带SSE3的P4(以滚烫到可以煎鸡蛋而闻名);nocona则是最新的带有EMT64(64位)的P4(同样可以煎鸡蛋)

win7 64位 系统和 win 7 32位 系统的区别

Win7 x64 vs Win7 x86 内存 这是64位系统最显著的优点,它可以使用超过4GB的内存。大多数新的台式机和笔记本电脑至少拥有4GB的内存。问题是,像Vista和Win 7的32位版本只能够用大约3GB的内存。相比之下,64位的Windows 不仅可以利用高达192GB的内存,还能够使用的内存映射取代BIOS的功能,从而使操作系统真正使用完整的4GB的。因此,如果您安装Win7 x64,对于有的4GB内存的机器你不会浪费1GB 内存。 个人认为,3GB不足够用于日常应用只是一个时间问题。一个例子是的Win 7的XP模式功能,它可以让你用旧的应用在一个虚拟机运行在Windows XP中。此功能可以用于各种目的,例如运行Office 2007和Office 2003年在同一台计算机上同时进行,或者是IE(对WEB开发很有用)。但WinXP模式需要至少512MB~1GB内存才能正常运行,因此XP模式非常吃内存。因此,如果您现在部署Windows 7 32位,那么你可能会很快要移动到64位,仅仅因为你必须升级您的机器与新的内存。我自己的笔记本电脑拥有8GB的内存,这是因为为了自己开发的程序在每个虚拟机环境下都能运行。我不想浪费内存中每一个字节。 64位真提供更好的性能了么? 我猜很多人认为64位处理器要快于32位处理器。因为有这样一个事实,从8位过渡到16位,从16位过渡到32位的过程确实带来了一些性能提升。基于以上的原因,是否可以认为64位的处理器可以更快? 有这么一个例子,很多32位处理器支持S***指令集,但是大多数程序员根本不会使用它们,因为这会妨碍到不支持这些指令集的电脑运行他们编译的程序(e.g.SSE2可以令Zip压缩更快,但是最常用的3个压缩软件都没有使用它)。 因此,只有应用了64位优化的64位程序才会有性能提升。不幸的是大多数Windows应用程序并没有做这个优化。 不过最近一年来,新生了很多的64位应用程序,但不要错误地认为,它们将比32位版本更快。因为通常情况下,这个64位版本的制作,仅是因为32位版本无法正常运行在64位Windows操作系统上。但是有些对64位有性能依赖的程序,比如数学计算(e.g.Mathlab)和各类视频处理软件,或者软件开发者明确的支持64位(e.g.7zip),那么速度可能较32位版本有明显的变化。 另一方面,win64不会减慢您的计算机性能。虽然类似CLR(.net底层)的程序会进行一些计算使32位程序能够运行在64位系统上,逻辑上需要花费较多的时间。但是,在实践中你会不知道其中的差别。几乎所有性能测试都可以证明,在大多数情况下不用在意64位和32位之间性能差异。 因此,更好的CPU性能不是升级到64位的理由。

电脑系统64位与32位的区别

第一,设计初衷不同。64位操作系统的设计初衷是:满足机械设计和分析、三维动画、视频编辑和创作,以及科学计算和高性能计算应用程序等领域中需要大量内存和浮点性能的客户需求。换句简明的话说就是:它们是高科技人员使用本行业特殊软件的运行平台。而32位操作系统是为普通用户设计的。 第二,要求配置不同。64位操作系统只能安装在64位电脑上(CPU 必须是64位的)。同时需要安装64位常用软件以发挥64位(x64)的最佳性能。32位操作系统则可以安装在32位(32位CPU)或64位(64位CPU)电脑上。当然,32位操作系统安装在64位电脑上,其硬件恰似“大马拉小车”:64位效能就会大打折扣。 第三,运算速度不同。64位CPU GPRs(General-Purpose Registers,通用寄存器)的数据宽度为64位,64位指令集可以运行64位数据指令,也就是说处理器一次可提取64位数据(只要两个指令,一次提取8个字节的数据),比32位(需要四个指令,一次提取4个字节的数据)提高了一倍,理论上性能会相应提升1倍。 第四,寻址能力不同。64位处理器的优势还体现在系统对内存的控制上。由于地址使用的是特殊的整数,因此一个ALU(算术逻辑运算器)和寄存器可以处理更大的整数,也就是更大的地址。比如,Windows Vista x64 Edition支持多达128 GB的内存和多达16 TB的虚拟内存,而32位CPU和操作系统最大只可支持4G内存。 第五,软件普及不同。目前,64位常用软件比32位常用软件,要少得多的多。道理很简单:使用64位操作系统的用户相对较少。因此,

软件开发商必须考虑“投入产出比”,将有限资金投入到更多使用群体的软件之中。这也是为什么64位软件价格相对昂贵的重要原因(将成本摊入较少的发售之中)。 总而言之,Microsoft Windows 64位操作系统,必须“上”靠64位主机硬件的支撑,“下”靠64位常用软件的协助,才能将64位的优势发挥到极致,“三位一体”缺一不可(道理很简单:操作系统只是承上启下的运行平台)。至于64位电脑可以安装32位操作系统,64位操作系统可以安装32位软件,那是设计上的“向下兼容”,不是64位设计初衷的本来含义。

相关主题