新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > Linux下C编程基础之:gcc编译器

Linux下C编程基础之:gcc编译器

作者:时间:2013-09-13来源:网络收藏

本文引用地址:http://www.eepw.com.cn/article/257151.htm

我们用unsgn_pow.c文件可以制作一个。下面分别讲解怎么生成静态库和动态库。

n 静态库的创建和使用。

创建静态库比较简单,使用归档工具ar将一些目标文件集成在一起。

[root@localhostlib]#gcc-cunsgn_pow.c

[root@localhostlib]#arrcsvlibpow.aunsgn_pow.o

a-unsgn_pow.o

下面编译主程序,它将会链接到刚生成的静态库libpow.a。具体运行结果如下所示。

[root@localhostlib]#gcc-opow_testpow_test.c-L.–lpow

[root@localhostlib]#./pow_test210

2^10=1024

其中,选项“-Ldir”的功能与“-Idir”类似,能够在库文件的搜索路径列表中添加dir目录,而“-lname”选项指示编译时链接到库文件libname.a或者libname.so。本实例中,程序pow_test.c需要使用当前目录下的一个静态库libpow.a。

n 动态库的创建和使用。

首先使用gcc的-fPIC选项为动态库构造一个目标文件

[root@localhostlib]#gcc-fPIC-Wall-cunsgn_pow.c

接下来,使用-shared选项和已创建的位置无关目标代码,生成一个动态库libpow.so。

[root@localhostlib]#gcc-shared-olibpow.sounsgn_pow.o

下面编译主程序,它将会链接到刚生成的动态库libpow.so。

[root@localhostlib]#gcc-opow_testpow_test.c-L.–lpow

在运行可执行程序之前,需要注册动态库的路径名。其方法有几种:修改/etc/ld.so.conf文件,或者修改LD_LIBRARY_PATH环境变量,或者将库文件直接复制到/lib或者/usr/lib目录下(这两个目录为系统的默认的库路径名)。

[root@localhostlib]#cplibpow.so/lib

[root@localhostlib]#./pow_test210

2^10=1024

动态库只有当使用它的程序执行时才被链接使用,而不是将需要的部分直接编译入可执行文件中,并且一个动态库可以被多个程序使用故可称为共享库,而静态库将会整合到程序中,因此在程序执行时不用加载静态库。从而可知,链接到静态库会使用户的程序臃肿,并且难以升级,但是可能会比较容易部署。而链接到动态库会使用户的程序轻便,并且易于升级,但是会难以部署。

(3)告警和出错选项。

gcc的告警和出错选项如表3.9所示。

表3.9 gcc警告和出错选项选项列表

选项

含义

-ansi

支持符合ANSI标准的C程序

-pedantic

允许发出ANSIC标准所列的全部警告信息

-pedantic-error

允许发出ANSIC标准所列的全部错误信息

-w

关闭所有告警

-Wall

允许发出gcc提供的所有有用的报警信息

-werror

把所有的告警信息转化为错误信息,并在告警发生时终止编译过程

下面结合实例对这几个告警和出错选项进行简单的讲解。

有以下程序段:

#includestdio.h>

voidmain()

{

longlongtmp=1;

printf(Thisisabadcode!\n);

return0;

}

这是一个很糟糕的程序,读者可以考虑一下有哪些问题。

n “-ansi”

该选项强制gcc生成标准语法所要求的告警信息,尽管这还并不能保证所有没有警告的程序都是符合ANSIC标准的。运行结果如下所示:

[root@localhostgcc]#gcc–ansiwarning.c–owarning

warning.c:在函数“main”中:

warning.c:7警告:在无返回值的函数中,“return”带返回值

warning.c:4警告:“main”的返回类型不是“int”

可以看出,该选项并没有发现“longlong”这个无效数据类型的错误。

n “-pedantic”

打印ANSIC标准所列出的全部警告信息,同样也保证所有没有警告的程序都是符合ANSIC标准的。其运行结果如下所示:

[root@localhostgcc]#gcc–pedanticwarning.c–owarning

warning.c:在函数“main”中:

warning.c:5警告:ISOC90不支持“longlong”

warning.c:7警告:在无返回值的函数中,“return”带返回值

warning.c:4警告:“main”的返回类型不是“int”

可以看出,使用该选项查出了“longlong”这个无效数据类型的错误。

n “-Wall”

打印gcc能够提供的所有有用的报警信息。该选项的运行结果如下所示:

[root@localhostgcc]#gcc–Wallwarning.c–owarning

warning.c:4警告:“main”的返回类型不是“int”

warning.c:在函数“main”中:

warning.c:7警告:在无返回值的函数中,“return”带返回值

warning.c:5警告:未使用的变量“tmp”

使用“-Wall”选项找出了未使用的变量tmp,但它并没有找出无效数据类型的错误。

另外,gcc还可以利用选项对单独的常见错误分别指定警告。

linux操作系统文章专题:linux操作系统详解(linux不再难懂)

linux相关文章:linux教程


c++相关文章:c++教程




评论


相关推荐

技术专区

关闭