【Linux学习】课时11_Linux软件开发工具(1)

曾巧文 发布于:2012-5-11 0:27 分类:Linux学习 标签: Ubuntu linux 课时

1、Linux软件开发工具(1)
掌握gcc工具的使用
理解预处理、编译、汇编、链接

2、Linux软件开发基础
Linux的一些相关标准
所谓标准是指一系列的接口规范 (函数声明)
ANSI C:这一标准是 ANSI(美国国家标准局)于 1989 年制定的 C 语言标准。99年又有新的版本。
POSIX:表示Unix可移植操作系统接口,IEEE制定该标准是为了提高 UNIX 环境下应用程序的可移植性。
SVID: 表示System V 接口描述,是描述 AT&T Unix System V 操作系统的文档,是对 POSIX 标准的扩展超集。
XPG:X/Open 可移植性指南。X/Open 公司拥有 Unix 的版权,而 XPG 则指定成为 Unix 操作系统必须满足的要求。

3、Linux软件开发基础
Linux下C语言开发环境至少包含三个部分:
编译器:将“高级语言”翻译为“机器语言(低级语言)”,生成目标文件。
gcc:是一套由 GNU 开发的编程语言编译器,原本只能处理 C语言,现在已能编译多种语言了。
函数库文件:一个包含了一些编译好的代码和数据的文件。这些编译好的代码和数据可以给其他程序使用。
Linux下的函数库一般在/lib和/usr/lib下
glibc: 是gnu发布的libc库,实现了ANSI C、POSIX、XPG等标准,也是Linux下C语言最主要函数库。
函数库头文件:包含功能函数、数据接口声明。
Linux下的头文件一般在/usr/include下。

4、编译器gcc
编译器gcc
gcc [options] [filenames]
在gcc后面可以有多个编译选项,当不用任何选项编译一个程序时,GCC将会直接生成一个名为a.out的可执行文件。 -o选项可以指定生成的目标文件。
也可以使用gcc灵活地控制编译过程 。


编译器gcc
Linux下的 main函数

5、编译器gcc
预处理 (preprocess)
预处理器是一个文本处理程序,它在程序编译的第一个阶段处理源代码的文本,预处理阶段主要完成:宏替换、文件包含、条件编译。
宏替换:宏定义:#define 宏名 字符串;宏展开:将源代码中的宏名替换成字符串
文件包含:#include搜索头文件,并把头文件的内容加到当前的文件中。
条件编译:有些语句希望在满足条件时才编译。
gcc使用示例:
gcc hello.c -E -o hello.i
gcc hello.c -DDEBUG -E -o hello.i
说明:-E预处理,.i预处理后的文件的后缀名,-D定义宏,DEBUG宏名,-D和宏名之间没有空格。

6、编译器gcc
编译 (compile)
是指从高级语言转换成汇编语言的过程。从本质上编译是一个文本转换的过程(从文本文件到文本文件)。编译包含了C语言的语法解析和生成汇编语言两个步骤。
gcc使用示例:
gcc hello.i -S -o hello.s
说明:-S编译,.s汇编文件的后缀名。
编译器gcc

7、汇编 (assemble)
是指从汇编语言程序生成目标系统的二进制代码(机器代码)的过程。相对于编译过程的语法解析,汇编的过程相对简单。这是因为对于一款特定的处理器,其汇编语言和二进制的机器代码是一一对应的。
gcc使用示例:
gcc hello.s -c -o hello.o
说明:-c只汇编生成二进制文件,这个二进制文件没有经过链接的过程,还不是一个可执行文件,.o二进制目标文件的后缀名。
编译器gcc

8、链接(link)
将汇编成的多个机器代码组合成一个可执行程序。一般来说,通过编译和汇编过程,每一个源文件将生成一个目标文件。链接器的作用就是将这些目标文件组合,组合的过程包括了代码段、数据段等部分的合并,以及添加相应的文件头。
静态链接:由链接器在链接时将库的内容加入到可执行程序中,生成的程序较大。
动态链接:在可执行文件装载时或运行时,由操作系统的装载程序加载库。
gcc使用示例:
gcc hello.o -o hello // 动态链接
gcc hello.o -static -o hello // 静态链接
默认是采用动态链接的方式,除非指定用静态链接
编译器gcc
gcc通过扩展名来判断文件的类型,从而确定用何种方式处理该文件


9、函数库
函数库的类型
系统中可用的库默认都存放在/lib、/usr/lib、/usr/local/lib目录中。库文件名由前缀lib和库名以及后缀组成。
共享库:在使用共享库动态链接的情况下,可执行文件启动或者运行的时候才会载入库,多个应用程序可以共享同一个共享库,即多个程序都要用到某个共享库,内存中只需要加载一次就行了。共享库文件名的格式:库的名称.so.主版本号.次版本号
静态库:在使用静态库的情况下,在编译链接可执行文件时,链接器从库中复制这些函数和数据并把它们和应用程序的其它模块组合起来创建最终的可执行文件。静态库文件名的格式:库的名称.a

 

10、头文件
系统头文件默认位置:/usr/include/*
用户头文件默认位置:/usr/local/include/*
在标准C中有两种形式的头文件使用方式:
#include 
#include “headfile.h”
区别:
#include 型头文件搜索范围为系统默认头文件存放位置。
#include “headfile.h” 型头文件先搜索当前目录,若当前目标不存在headerfile.h,再到系统默认存放头文件位置去搜索。

11、静态库的创建与使用
Step1 : 编译生成目标代码但不链接
gcc test1.c -c -o test1.o
gcc test2.c -c -o test2.o
Step2 : 用ar命令生成静态库
ar rs libtest.a test1.o test2.o
选项r表示将后面的目标文件打包到libtest.a中
选项s表示创建索引,这个索引会被连接器使用
Step3 : 使用静态库编译、链接
gcc hello.c -L. -ltest -o hello
-L.表示要到当前目录下去找库文件
-ltest表示要链接libtest库

 

12、共享库的创建与使用
Step1: 编译库文件,生成共享库
gcc test1.c test2.c -fPIC -shared -o libtest.so
-fPIC表示Position Independent Code与位置无关的代码。
Step2: 使用共享库编译、链接和运行
gcc hello.c -L. -ltest -o hello
使链接器能找到生成的共享库,看帮助 : man ld.so
将库文件路径添加到环境变量LD_LIBRARY_PATH
将库文件路径添加到/etc/ld.so.conf配置文件中,再使用ldconfig -v 命令更新下/etc/ld.so.cache
直接将库文件放到库文件默认位置下。
可使用命令ldd查看可执行文件所使用的共享库

 

13、gcc常用功能总结
-o outfile : 指定输出文件名为outfile
-E : 只进行预处理生成*.i的文件
-S : 只编译成*.s的汇编语言文件
-c : 只编译成*.o的目标文件,不链接
-Idir : 将目录 dir添加到头文件搜索范围
-Ldir : 将目录dir作为库文件搜索范围
-lmylib : 链接时搜索库libmylib
-shared : 生成共享库
-static : 禁止使用共享库(用静态库)

版权所有:《曾巧文博客-关注互联网IT技术,记录生活点滴》 => 《【Linux学习】课时11_Linux软件开发工具(1)
本文地址://qiaowen.net/post-1216.html
除非注明,文章均为 《曾巧文博客-关注互联网IT技术,记录生活点滴》 原创,欢迎转载!转载请注明本文地址,谢谢。

有 4695 人浏览,获得评论 0 条

发表评论:

Powered by emlog 粤ICP备12040901号

>>本作品采用-知识共享署名-非商业-禁止演绎-协议-进行许可 |站点地图 | | | | 开放分类目录 |