要开始Unix/Linux编程之旅,绕不开的是程序的编译。这方面的资料多如牛毛但又散如繁星。
而最近因工作原因又过了一遍。想想干脆把gcc到Makefile一次整个遍,弄成一系列。
以后用时也不用又东找西查了。
编译小结系列:
(1) gcc安装(Linux,Aix,HP-UX,Solaris)
(2) gcc常见用法及技巧
(3) 动态库(.so)编译及二种调用技巧
(4) 说说静态库(.a)
(5) Makefile项目实用例子
(6) 编译与发布常见问题处理集
其实C/C++编译器有很多种选择,Windows下的VC系列,AIX,HP-UX....等也有各自商用的C/C++编译器,
但都是收费的。而开源编译器中,虽然基于LLVM的Clang最近二年很火,但gcc应当还是目前用得最多的。而且也很好使。
gcc编译器跨平台支持多语言,其中通过gcc与g++来编译C/C++程序。
其中gcc命令常用来编译C语言程序,而g++则用来编译C++程序。
但不要走入误区,认为两个命令界限明显那就错了。
实际上两个命令都可以相互编译.c和.cpp文件。区别只在于gcc编译C++时,只能编译C++源文件,
但不能自动与C++程序使用的库进行关联。而g++则能可以自动完成C++程序的编译和连接。
下面简单介绍下gcc在各个系统上的安装,并附了个网上找的gcc命令参数列表。
一。检查是否已有安装编译器:
用which gcc 或用gcc --version 或 g++ --version来检查即可。
例子:
# gcc --version
gcc (GCC) 3.3.2
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
二。各个操作系统下的安装:
Linux:
Linux下,yum安装是最快捷的方法
yum -y install gcc
yum -y install gcc-c++
Aix:
1.首先到http://www-03.ibm.com/systems/power/software/aix/linux/toolbox/download.html
下载rpm.rte包并安装,使Aix支持rpm包。
installp -qacXgd rpm.rte rpm.rte
通常会装在 /opt/freeware/bin/rpm 目录下。
2。可以找到ftp路径: ftp://ftp.software.ibm.com/aix/freeSoftware/aixtoolbox
下载相关的rpm包后上传到AIX下安装即可
以AIX5.3为例
#rpm -ivh gcc-4.0.0-1.aix5.3.ppc.rpm
#rpm -ivh libgcc-4.0.0-1.aix5.3.ppc.rpm
#rpm -ivh libstdcplusplus-4.0.0-1.aix5.3.ppc.rpm
#rpm -ivh libstdcplusplus-devel-4.0.0-1.aix5.3.ppc.rpm
#rpm -ivh gcc-cplusplus-4.0.0-1.aix5.3.ppc.rpm
HP-UX:
1.首先去HP官网下载gcc的软件包后,上传到服务器,使用swinstall安装
如:
swinstall -s /temp/gcc-hppa-4.2.4.depot.gz
在上面的sam中安装完成后,使用swlist -l file gcc 应当能看到gcc.
2.再将gcc加入PATH中,方便使用.
首先用whereis gcc查看gcc的安装目录,如没有问题则将gcc所在目录加入到PATH环境变量中
完成安装。
SUN Solaris:
1.下载gcc,注意版本要与操作系统保持匹配。
ftp://ftp.cdit.edu.cn/pub/unix/solaris/sparc25
或 www.sunfreeware.com
小技巧:
要是分不清是X86还是SPARC,用 uname -a 查看,
如包含"i86pc"之类,就为X86架构,如有"sparc"则为SPARC架构。
2.将下载下来的gz文件解压后,用pkgadd ld ./gccxxx 安装
3. 将gcc所在目录加入PATH环境变量
三。gcc命令参数:
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,也就是取消源程序中的某个宏定义
-I dir 将dir目录加到搜寻头文件的目录中去,并优先于gcc中缺省的搜索目录,有多个-I选项时,按照出现顺序搜索
-L dir 将dir目录加到搜索-lname选项指定的函数库文件的目录列表中去,并优先于gcc缺省的搜索目录,有多个-L选项时,按照出现顺序搜索
-lname 在链接时使用函数库libname.a,链接程序在-L dir指定的目录和/lib、/usr/lib目录下寻找该库文件,在没有使用-static选项时,如果发现共享函数库libname.so,则使用libname.so进行动态链接
-fPIC 产生位置无关的目标代码,可用于构造共享函数库
-static 禁止与共享函数库链接
-shared 尽量与共享函数库链接(默认)
gcc默认提供了5级优 化选项的集合:
-O0:无优化(默认)
-O和-O1:使用能减少目标文 件 大小以及执行时间并且不会使编译时间明显增加的优化.在编译大型程序的时候会显著增加编译时内存的使用.
-O2: 包含-O1的优化并增加了不需要在目标文件大小和执行速度上进行折衷的优化.编译器不执行循环展开以及函数内联.此选项将增加编译时间和目标文件的执行性 能.
-Os:专门优化目标文件大小,执行所有的不增加目标文件大小的-O2优化选项.并且执行专门减小目标文件大小的优化选项.
-O3: 打开所有-O2的优化选项并且增加 -finline-functions, -funswitch-loops,-fpredictive-commoning, -fgcse-after-reload and -ftree-vectorize优化选项.
-ansi
支持符合ANSI标准的C程序。这样就会关闭GNU C中某些不兼容ANSI C的特性。
-std=c89
-iso9899:1990
指明使用标准 ISO C90 作为标准来编译程序。
-std=c99
-std=iso9899:1999
指明使用标准 ISO C99 作为标准来编译程序。
-std=c++98
指明使用标准 C++98 作为标准来编译程序。
-std=gnu9x
-std=gnu99
使用 ISO C99 再加上 GNU 的一些扩展。
而最近因工作原因又过了一遍。想想干脆把gcc到Makefile一次整个遍,弄成一系列。
以后用时也不用又东找西查了。
编译小结系列:
(1) gcc安装(Linux,Aix,HP-UX,Solaris)
(2) gcc常见用法及技巧
(3) 动态库(.so)编译及二种调用技巧
(4) 说说静态库(.a)
(5) Makefile项目实用例子
(6) 编译与发布常见问题处理集
其实C/C++编译器有很多种选择,Windows下的VC系列,AIX,HP-UX....等也有各自商用的C/C++编译器,
但都是收费的。而开源编译器中,虽然基于LLVM的Clang最近二年很火,但gcc应当还是目前用得最多的。而且也很好使。
gcc编译器跨平台支持多语言,其中通过gcc与g++来编译C/C++程序。
其中gcc命令常用来编译C语言程序,而g++则用来编译C++程序。
但不要走入误区,认为两个命令界限明显那就错了。
实际上两个命令都可以相互编译.c和.cpp文件。区别只在于gcc编译C++时,只能编译C++源文件,
但不能自动与C++程序使用的库进行关联。而g++则能可以自动完成C++程序的编译和连接。
下面简单介绍下gcc在各个系统上的安装,并附了个网上找的gcc命令参数列表。
一。检查是否已有安装编译器:
用which gcc 或用gcc --version 或 g++ --version来检查即可。
例子:
# gcc --version
gcc (GCC) 3.3.2
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
二。各个操作系统下的安装:
Linux:
Linux下,yum安装是最快捷的方法
yum -y install gcc
yum -y install gcc-c++
Aix:
1.首先到http://www-03.ibm.com/systems/power/software/aix/linux/toolbox/download.html
下载rpm.rte包并安装,使Aix支持rpm包。
installp -qacXgd rpm.rte rpm.rte
通常会装在 /opt/freeware/bin/rpm 目录下。
2。可以找到ftp路径: ftp://ftp.software.ibm.com/aix/freeSoftware/aixtoolbox
下载相关的rpm包后上传到AIX下安装即可
以AIX5.3为例
#rpm -ivh gcc-4.0.0-1.aix5.3.ppc.rpm
#rpm -ivh libgcc-4.0.0-1.aix5.3.ppc.rpm
#rpm -ivh libstdcplusplus-4.0.0-1.aix5.3.ppc.rpm
#rpm -ivh libstdcplusplus-devel-4.0.0-1.aix5.3.ppc.rpm
#rpm -ivh gcc-cplusplus-4.0.0-1.aix5.3.ppc.rpm
HP-UX:
1.首先去HP官网下载gcc的软件包后,上传到服务器,使用swinstall安装
如:
swinstall -s /temp/gcc-hppa-4.2.4.depot.gz
在上面的sam中安装完成后,使用swlist -l file gcc 应当能看到gcc.
2.再将gcc加入PATH中,方便使用.
首先用whereis gcc查看gcc的安装目录,如没有问题则将gcc所在目录加入到PATH环境变量中
完成安装。
SUN Solaris:
1.下载gcc,注意版本要与操作系统保持匹配。
ftp://ftp.cdit.edu.cn/pub/unix/solaris/sparc25
或 www.sunfreeware.com
小技巧:
要是分不清是X86还是SPARC,用 uname -a 查看,
如包含"i86pc"之类,就为X86架构,如有"sparc"则为SPARC架构。
2.将下载下来的gz文件解压后,用pkgadd ld ./gccxxx 安装
3. 将gcc所在目录加入PATH环境变量
三。gcc命令参数:
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,也就是取消源程序中的某个宏定义
-I dir 将dir目录加到搜寻头文件的目录中去,并优先于gcc中缺省的搜索目录,有多个-I选项时,按照出现顺序搜索
-L dir 将dir目录加到搜索-lname选项指定的函数库文件的目录列表中去,并优先于gcc缺省的搜索目录,有多个-L选项时,按照出现顺序搜索
-lname 在链接时使用函数库libname.a,链接程序在-L dir指定的目录和/lib、/usr/lib目录下寻找该库文件,在没有使用-static选项时,如果发现共享函数库libname.so,则使用libname.so进行动态链接
-fPIC 产生位置无关的目标代码,可用于构造共享函数库
-static 禁止与共享函数库链接
-shared 尽量与共享函数库链接(默认)
gcc默认提供了5级优 化选项的集合:
-O0:无优化(默认)
-O和-O1:使用能减少目标文 件 大小以及执行时间并且不会使编译时间明显增加的优化.在编译大型程序的时候会显著增加编译时内存的使用.
-O2: 包含-O1的优化并增加了不需要在目标文件大小和执行速度上进行折衷的优化.编译器不执行循环展开以及函数内联.此选项将增加编译时间和目标文件的执行性 能.
-Os:专门优化目标文件大小,执行所有的不增加目标文件大小的-O2优化选项.并且执行专门减小目标文件大小的优化选项.
-O3: 打开所有-O2的优化选项并且增加 -finline-functions, -funswitch-loops,-fpredictive-commoning, -fgcse-after-reload and -ftree-vectorize优化选项.
-ansi
支持符合ANSI标准的C程序。这样就会关闭GNU C中某些不兼容ANSI C的特性。
-std=c89
-iso9899:1990
指明使用标准 ISO C90 作为标准来编译程序。
-std=c99
-std=iso9899:1999
指明使用标准 ISO C99 作为标准来编译程序。
-std=c++98
指明使用标准 C++98 作为标准来编译程序。
-std=gnu9x
-std=gnu99
使用 ISO C99 再加上 GNU 的一些扩展。
MAIL: [email protected]
BLOG:http://blog.csdn.net/xcl168