Linux下GCC的安装,GCC链接外部库

GCC的安装

环境RedHatLinuxAS5
安装盘:RedHatLinuxAS5正式版DVD.iso

查看gcc版本:
# gcc -v

检查是否安装rpm包
# rpm -qa | grep rpm_name
# rpm -qa | grep gcc

加载:
# mkdir /mnt/cdrom
# mount /dev/cdrom /mnt/cdrom/
卸载:
# umount /mnt/cdrom/

进入cdrom,查找gcc安装包。在Server目录下
# cd /mnt/cdrom/
# find -iname gcc*

安装gcc:
# rpm -ivh Server/gcc-4.1.1-52.el5.i386.rpm

warning: Server/gcc-4.1.1-52.el5.i386.rpm: Header V3 DSA signature: NOKEY, key ID 37017186
error: Failed dependencies:
        glibc-devel >= 2.2.90-12 is needed by gcc-4.1.1-52.el5.i386
        libgomp = 4.1.1-52.el5 is needed by gcc-4.1.1-52.el5.i386
        libgomp.so.1 is needed by gcc-4.1.1-52.el5.i386

先安装所依赖的包。
# rpm -ivh Server/glibc-headers-2.5-12.i386.rpm
# rpm -ivh Server/glibc-devel-2.5-12.i386.rpm
# rpm -ivh Server/libgomp-4.1.1-52.el5.i386.rpm
再# rpm -ivh Server/gcc-4.1.1-52.el5.i386.rpm

安装gcc-c++:
# rpm -ivh Server/libstdc++-devel-4.1.1-52.el5.i386.rpm
# rpm -ivh Server/gcc-c++-4.1.1-52.el5.i386.rpm

安装gdb:
# rpm -ivh Server/gdb-6.5-16.el5.i386.rpm


查看RPM包安装路径:
rpm -ql rpm_name

==========================

 

GCC的使用

Hello World

#include <stdio.h>
int main(void)
{
	printf("Hello, world.\n");
	return 0;
}


保存成main.c,然后编译执行:
$ gcc main.c
$ ./a.out
Hello, world.

如果不想把文件名叫a.out,可以用gcc的-o参数自己指定文件名:
$ gcc main.c -o main

打开gcc的-Wall选项,也就是让gcc提示所有的警告信息,不管是严重的还是不严重的。
$ gcc -Wall main.c

==========================

 

链接外部库

库是预编译的目标文件(object files)的集合,它们可被链接进程序。静态库以后缀为‘.a’的特殊的存档文件(archive file)存储。标准系统库可在目录 /usr/lib 与 /lib 中找到。比如,在类 Unix 系统中 C 语言的数学库一般存储为文件 /usr/lib/libm.a。该库中函数的原型声明在头文件 /usr/include/math.h 中。C 标准库本身存储为 /usr/lib/libc.a,它包含 ANSI/ISO C 标准指定的函数,比如‘printf’。对每一个 C 程序来说,libc.a 都默认被链接。

调用数学库 libm.a 中 sqrt 函数的的例子:
math.c

#include <math.h>
#include <stdio.h>

int main (void)
{
	double x = sqrt (4.0);
	printf ("The value of sqrt(4.0) is %f\n", x);
	return 0;
}

# gcc -Wall math.c /usr/lib/libm.a -o math
# ./math
The value of sqrt(4.0) is 2.000000

如果不 加上/usr/lib/libm.a 会报错, 提示没有定义sqrt

因为函数 sqrt,未在本程序中定义也不在默认库‘libc.a’中;除非被指定,编译器也不会链接‘libm.a’。
为使编译器能将 sqrt 链接进主程序‘math.c’,我们需要提供数学库‘libm.a’。一个容易想到但比较麻烦的做法是在命令行中显式地指定它,即像上面那样。函数库‘libm.a’包含所有数学函数的目标文件,比如sin,cos,exp,log及sqrt。链接器将搜索所有文件来找到包含sqrt的目标文件。

一旦包含 sqrt 的目标文件被找到,主程序就能被链接,一个完整的可执行文件就可生成了.
可执行文件包含主城许的机器码以及函数库‘libm.a’中sqrt 对应的机器码。
为避免在命令行中指定长长的路径,编译器为链接函数库提供了快捷的选项‘-l’。例如,下面的命令

代码:
# gcc -Wall math.c -lm -o math      /*与 gcc -Wall math.c -lm -o math是样的效果*/
一般来说,选项 -lNAME使链接器尝试链接系统库目录中的函数库文件 libNAME.a。一个大型的程序通常要使用很多 -l 选项来指定要链接的数学库,图形库,网络库等。

posted @ 2010-06-23 00:27  浪海搏涛  阅读(2195)  评论(0编辑  收藏  举报