嵌入式Linux应用——GCC程序编译
介绍
使用GCC编译程序时,编译过程可以细分为四个阶段:
预处理
编译
组装(组装)
链接
文件类型
.c后缀的文件:C语言源代码文件
后缀为.a的文件:由目标文件组成的库文件
具有 .C、.cc 或 .cxx 扩展名的文件:C++ 源代码文件
.h后缀的文件:头文件
.i后缀的文件:已经经过预处理的C源代码文件
.ii后缀的文件:已经经过预处理的C++源代码文件
后缀为.o:的文件是编译后的目标文件
.s后缀的文件:是汇编语言源代码文件
.S后缀的文件:预编译的汇编语言源代码文件
入门(演示)
你好ç
#include
int main(void)
{
printf("Hello world!n");
return 0;
}
//编译和运行这段程序
# gcc hello.c -o hllo
# ./hello
输出:Hello wrold!
编译选项
gcc编译器大约有100个编译选项,这里只介绍最基本、最常用的参数。
-o 输出文件名:确定输出的可执行文件名——文件名。 如果没有给出这个选项,gcc将给出默认的可执行文件a.out。
-c:仅编译,不链接成可执行文件,编译器仅根据输入的源代码文件(例如.c)生成后缀为.o的目标文件
-g:生成调试工具(GNU gdb)所需的符号信息。 要调试编译后的程序,必须添加此选项。
-O:优化程序的编译和链接。 使用该选项,在编译和链接过程中会对整个源代码进行优化,这样形成的可执行文件的执行效率可以提高,但编译和链接的速度会相应变慢
-O2:比-O更好地优化编译和链接,当然整个编译和链接过程会更慢。
#include
int main(void)
{
double counter;
double result;
double temp;
for(counter=0;counter < 2000.0*2000.0*2000.0 / 20.0 + 2020;counter += (5-1)/4)
{
temp = counter /1979;
result = counter;
}
printf("Result is %lfn",result);
return 0;
}
//编译和运行这段程序
gcc optimize.c -o optimize
time ./optimize
gcc -O optimize.c -o optimize
time ./optimize
-Idriname:将dirname突出显示的目录添加到程序头文件目录列表中。 C程序中的头文件包含两种情况:
1.#include
2.#include“Bh”
其中gcc编译linux源码,预处理器cpp在系统预设的头文件目录(如:/usr/include)中搜索并拯救相应的文件; 对于“”,cpp会在当前目录中搜索并抢救头文件。 该选项的作用是告诉cpp,如果当前目录下没有找到需要的文件,则去指定的dirname目录中查找。
示例:gcc foo.c -I/home/include -o foo
-Ldriname:将dirname突出显示的目录添加到库文件的目录列表中。 默认情况下,链接器Id会在系统默认路径(如:/usr/lib)中搜索所需的库文件。 该选项告诉链接器首先到-L指定的目录进行搜索,然后再到系统默认路径中进行搜索。
-lname:连接时加载名为“libname.a”的库函数,该库函数位于系统默认目录或由-L选项确定的目录中。 例如,-lm 表示链接名为“libm.a”的物理函数库。
示例:gcc foo.c -L /home/lib -lfoo -o foo
C语言静态链接和动态链接
-static:静态链接库文件
示例:gcc -static hello.c -o hello
有两种类型的库:动态库和静态库。 一般动态的后缀是.os,静态的后缀是..
例如:libhello.so libhello.a。 当使用静态库时,链接器找到程序所需的函数并将它们复制到可执行文件中。 一旦链接成功,就不再需要静态库了。 但动态库则不然,它会在可执行程序中留下一个标记,表明程序执行时必须先加载该库。 因为动态库节省空间gcc编译linux源码,所以Linux下链接的默认操作是先链接动态库。
-Wall:生成所有警告消息
-w:不生成任何警告消息
-DMACRO:定义MACRO宏,相当于程序中使用#define MACRO
#include
int main(void)
{
#ifdef YES
printf("hello worldn");
#endif
return 0;
}
//编译和运行这段程序
//不打印出hello world
gcc hello.c -o hello
./hello
//会打印出hello world
gcc -DYES hello.c -o hello
./hello
发表评论