嵌入式Linux系统-GCC编译过程

程序开机启动流程

终止进程的运行:ctrl+z

GCC程序的编译过程

对于GUN编译器来说,程序的编译要经历预处理、编译、汇编、连接四个阶段,如下图所示:

        从功能上分,预处理。编译、江编是三个不同的阶段,但GCC的实际操作,上,它可以把这三个步骤合并为一个步骤来执行。下面以一个简单的C语言为例来示例C语言程序的编译过程。

hello.c
#include <stdio.h>
int main (void)
{
printf ("Hello world, Linux programming! \n") ;
return 0;
}

        在预处理阶段,输入的是C语言的源文件,通常为*.c。 它们通常带有.h之类头文件的包含文件。这个阶段主要处理源文件中的#ifdef、#include 和#define命令。该阶段会生成一个中间文件*.i,但实际工作中通常不用专门生成这种文件,若非要生成这种文件不可,可以利用下面的示例命令:

#gcc -E hello.c -o hello.i

        预处理完成后进行编译,将预处理后的文件转换成汇编语言。在编译阶段输入的是中间文件*. i,编译后生成汇编语言文件*. s。在编译过程中,GCC 首先检查代码是否符合规范、是否有语法错误等,在检查无误后,把代码翻译成汇编语言。所用命令如下:

# gcc 一S hello.i -o hello.s

        在汇编阶段将输入的汇编文件*. s转换成机器语言*.o。汇编就是将汇编指令变成二进
制的机器代码,即生成后缀为.o的目标文件。当程序由多个代码文件构成时,每个文件都
要先完成汇编工作,生成.o目标文件后进入下一-步链接工作。目标文件在链接之前还不能
执行。

# gcc -C hello.s -o hello.o

查看hello.o文件命令:vim hello.o,然后按esc进入命令模式输入  %!xxd  以二进制形式打开。

链接是编译的最后一一个阶段,将各个目标文件链接起来生成可执行程序。在连接阶段将输入的机器代码文件*.s汇集成--个可执行的二进制代码文件。GCC通过调用LD完成链接的。当程序执行过程中调用某些外部函数,链接器需要找到这些函数的代码,把这些代码添加到可执行文件中。

gcc hello.o -o hello 

GCC编译实例
编译简单的C程序
# gcc -g -Wall hello.c -o hello

  • 选项 -Wall开启编译器几乎所有常用的警告
  • 选项 -g 表示在生成的目标文件中带调试信息
    • 警告选项
      -Wall :开启所有错误提示
      -w:关闭所有警告
      -Werror :把警告当作错误来处理

头文件的处理

#include < head.h>
#include"myhead.h"


-I dir    在头文件的搜索路径列表中添加dir目录
# gcc -V hello.c -I /home/test

链接库处理:

        libc.so #标准C库,动态链接库
        libpthread.a #线程库,静态链接库

一个特殊静态链接库方式,把库完整名字加入

# gcc -o hello hello.o libmy.a

        -l参数用来链接库标准表达式方式
        -Ipthread表示链接libpthread.so

#gcc hello.c -lpthread -0 hello

-L参数来指明从哪一个目录加载库在/home/test/lib/目录下有链接时所需要的库文件libmy.so

gcc hello.c -L/home/test/lib -Imy - -0 hello

新安装一个库之后如何让系统能够找到呢?
1.编辑/etc/ld.so.conf文件,加入库文件所在目录的路径
2.运行ldconfig ,该命令会重建/etc/ld.so.cache文件
 

复杂的项目编译过程
第一步配置( configure )
第二步确定标准库和头文件的位置
第三步确定依赖关系
第四步头文件的预编译( precompilation )
第五步预处理(Preprocessing)
第六步编译( Compilation)
第七步连接(Linking)
第八步安装(Installation)
第九步操作系统连接
第十步生成安装包
 

调试程序-GDB

GDB功能:->启动程序->设置断点->查看变量->修改程序
GDB调试程序流程
代码

#include <stdio. h>
int func(int n)
int sum=0,i;
for(i=0; i<n; i++) 
sum+=i;
}
return sum ;
}
main( )
{
int i;
1ong result = 0;
for(i=1; i<=100; 1++)
{
result += i;
printf("result[1-100] = %d /n", result );
printf("result[1-250] = %d /n", func(250) );
}

Step 1        熟悉使用GDB调试程序的流程


Step 2        熟悉GDB常用命令


Step 3        GDBServer远程调试

编辑工具VI

基本操作;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值