微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > Linux下C编程基础之:gcc编译器

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

时间:08-13 来源:3721RD 点击:

汇编阶段是把编译阶段生成的".s"文件转成目标文件,读者在此使用选项"-c"就可看到汇编代码已转化为".o"的二进制目标代码了,如下所示:

[root@localhost gcc]# gcc –c hello.s –o hello.o

(4)链接阶段。

在成功编译之后,就进入了链接阶段。这里涉及一个重要的概念:函数库。

读者可以重新查看这个小程序,在这个程序中并没有定义"printf"的函数实现,且在预编译中包含进的"stdio.h"中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实现"printf"函数的呢?最后的答案是:系统把这些函数的实现都放到名为libc.so.6的库文件中去了,在没有特别指定时,gcc会到系统默认的搜索路径"/usr/lib"下进行查找,也就是链接到libc.so.6函数库中去,这样就能调用函数"printf"了,而这也正是链接的作用。

函数库有静态库和动态库两种。静态库是指编译链接时,将库文件的代码全部加入可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名通常为".a"。动态库与之相反,在编译链接时并没有将库文件的代码加入可执行文件中,而是在程序执行时加载库,这样可以节省系统的开销。一般动态库的后缀名为".so",如前面所述的libc.so.6就是动态库。gcc在编译时默认使用动态库。

完成了链接之后,gcc就可以生成可执行文件,如下所示。

[root@localhost gcc]# gcc hello.o –o hello

运行该可执行文件,出现的正确结果如下。

[root@localhost gcc]# ./hello

Hello! This is our embedded world!

3.3.2 gcc编译选项分析

gcc有超过100个可用选项,主要包括总体选项、告警和出错选项、优化选项和体系结构相关选项。以下对每一类中最常用的选项进行讲解。

(1)常用选项。

gcc的常用选项如表3.7所示,很多在前面的示例中已经有所涉及。

表3.7 gcc常用选项列表

选 项

含 义

-c

只编译不链接,生成目标文件".o"

-S

只编译不汇编,生成汇编代码

-E

只进行预编译,不做其他处理

-g

在可执行程序中包含标准调试信息

-o file

将file文件指定为输出文件

-v

打印出编译器内部编译各过程的命令行信息和编译器的版本

-I dir

在头文件的搜索路径列表中添加dir目录

前一小节已经讲解了"-c"、"-E"、"-o"、"-S"选项的使用方法,在此主要讲解另外2个非常常用的库依赖选项"-I dir"。

n "-I dir"

正如上表中所述,"-I dir"选项可以在头文件的搜索路径列表中添加dir目录。由于Linux中头文件都默认放到了"/usr/include/"目录下,因此,当用户希望添加放置在其他位置的头文件时,就可以通过"-I dir"选项来指定,这样,gcc就会到相应的位置查找对应的目录。

比如在"/root/workplace/gcc"下有两个文件:

/* hello1.c */

#include<my.h>

int main()

{

printf("Hello!!\n");

return 0;

}

/* my.h */

#include<stdio.h>

这样,就可在gcc命令行中加入"-I"选项:

[root@localhost gcc] gcc hello1.c –I /root/workplace/gcc/ -o hello1

这样,gcc就能够执行出正确结果。

小知识

在include语句中,"<>"表示在标准路径中搜索头文件,""""表示在本目录中搜索。故在上例中,可把hello1.c的"#include<my.h>"改为"#include "my.h"",就不需要加上"-I"选项了。

(2)库选项。

gcc库选项如表3.8所示。

表3.8 gcc库选项列表

选 项

含 义

-static

进行静态编译,即链接静态库,禁止使用动态库

-shared

1.可以生成动态库文件

2.进行动态编译,尽可能地链接动态库,只有当没有动态库时才会链接同名的静态库(默认选项,即可省略)

-L dir

在库文件的搜索路径列表中添加dir目录

-lname

链接称为libname.a(静态库)或者libname.so(动态库)的库文件。若两个库都存在,则根据编译方式(-static还是-shared)而进行链接

-fPIC(或-fpic)

生成使用相对地址的位置无关的目标代码(Position Indepen

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top