gcc编译linux源码-嵌入式Linux应用——GCC程序编译

嵌入式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