Linux系统下的c语言编程

            Linux操作系统支持多种高级语言,其中就包括c语言,linux系统的内核的绝大多数代码就是用c编写的,另外Linux平台上的许多应用程序也是用c完成的。Liinux系统拥有许多用于用于程序的生成以及分析的软件工具。其中c语言主要使用gcc和make工具等,学会使用这些工具对初学者十分重要。

           可以使用Linux中的多种文本编辑器(如vi、pico、gedit、emacs等)来编写程序,下面用vi文本来编写一个c语言程序输出“hello linux”

           首先打开vi文本编辑器文件名为hello.c,输入程序代码,这和我们平时编写的C语言程序一样,接着保存退出,然后就是使用gcc编译、链接后生成可执行文件hello,最后运行hello文件。

          

           Linux下最常用的C编辑器是GNU gcc。gcc命令可以启动c编译系统,当执行gcc时,它将完成预处理、编译、汇编和连接4个步骤并生成最后的可执行代码。产生的可执行程序默认保存为a.out文件。gcc命令可以接受发多种文件类型并依据用户指定的命令行参数对它们做出相应的处理。这些文件类型包括静态链接库(扩展名为.a),c语言源程序(.c),c++源文件(.C,.cc或者.cpp),汇编语言源文件(.s),预处理输出文件(.i)和目标代码(.o)。如果gcc无法根据一个文件的扩展名来判断一个文件的类型,它将假设这个文件是一个目标文件或库文件。

            gcc支持编译的后缀名:

                   

.后缀名对应的语言
.cC原始程序
.CC++原始程序
.ccC++原始程序
.cxxC++原始程序
.mObjective-C原始程序
.i已经过预处理的C原始程序
.ii已经过预处理的C++原始程序
.s汇编语言原始程序
.S汇编语言原始程序
.h预处理文件(头文件)
.o目标文件
.a/.so编译后的库文件
             gcc 命令语法: gcc 【options】 filename-list

             常用选项:

             -ansi                                               以ANSI标准

             -c                                                     跳过连接步骤,编译成目标(.o)文件

             -g                                                     创建用于gdb的符号表和调试信息

             -S                                                    跳过汇编和连接阶段,并保留编译产生的汇编代码(.a文件)

             -v                                                     产生尽可能多的输出信息

             -w                                                   忽略警告信息

             -o                                                    将生成的可执行程序保存到指定文件中,而不是默认的a.out

  
             函数库:函数库是一组预先编译好的函数的集合,这些函数都是按照可重用的原则编写的,它们通常由一些相互关联的函数组成并执行某项常见的任务。

             标准系统库文件一般存放在Linux文件系统/lib和/usr/lib目录中。库文件的名字以lib开头,最后部分以.开始,后面跟类型:.a代表传统的静态函数库    .so代表共享函数库

             例如,libm.a为静态数学函数库

             函数库通常以静态库和共享库两种格式存在,可用ls    /usr/lib命令查看

             下面创建一个小型函数库,它包含两个函数pro1和pro2,然后在一个示例程序中调用pro2,然后运行,调试

              1.编写两个函数pro1和pro2的源文件

             

              2.用gcc编译这两个函数,产生包含在库文件中的目标函数。使用gcc 的 -c 选项是为了阻止编译器创建一个完整的程序,gcc将把源程序编译成目标函数,文件尾以.o结尾。如果此时试图创建一个完整的程序将不会成功,以为还未定义main函数

             

              3.为库文件创建一个头文件lib.h

             

              4.编写主程序,调用pro2

             

             5.编译并测试这个程序。暂时为编译器显式指定目标文件,然后要求编译器编译的文件并将其与预先编译好的目标模块pro2.o链接

           

            6.现在,创建并使用一个空文件。用ar程序创建一个归档文件并将目标文件添加进去,当然ar也可以用来创建任何类型的归档文件

           

           当然也可以用-l选项来访问函数库,但是因为其未保存在标准位置,所以必须用-L选项来指示gcc在何处可以找到它,如下所示:;

          

           可以使用nm命令来查看目标文件、函数库或可执行文件里包含的函数

          

           静态库的一个缺点,当同时运行许多应用程序并且它们都使用来自同一个函数库的函数时,就会在内存中有同一函数的多份拷贝,在程序文件自身也有多份同样的拷贝。这将消耗大量宝贵的内存和磁盘空间。共享库克服了这种不足,可以用共享库来实现函数的动态链接。

           在c语言开发的程序中,许多头文件和源文件都互相依赖。如果修改了其中的一个文件,就必须重新编译所有依赖它的文件。Linux有个很强大的工具make,它可以管理多个模块。make工具依赖一个特殊的,名字为makefile或Makefile的文件,这个文件描述了系统中的各个模块之间的依赖关系。系统中的部分文件改变时,make根据这些关系决定一个需要重新编译的文件的最小集合。如果软件包括几十个源文件和多个可执行文件,这时make工具特别有用。

           make工具的命令语法:

           make [选项]    [目标]  [宏定义]

           常用选项:

           -d                               显示调试信息

           -f 文件                       此选项告诉make使用指定文件作为依赖关系文件

           -n                              不执行makefile中的命令,只是显示输出这些命令

           -s                              执行但不显示任何信息

           GNU make的主要功能是读进一个文本文件makefile并根据makefile的内容执行一系列的工作。

           一个Makefile文件主要包括含有一系列的make规则,每条make规则包含以下内容:

           目标文件列表:依赖文件列表

          <TAB> 命令列表

           Linux系统中有许多调试器,包括gdb、kgdb、xxgdb、mxgdb等。GNU调试程序gdb可以用于调试C、C++、Module-2、PASCAL等多种语言携程的程序。

           下面利用一个函数来掩饰gdb的调试用法,这个函数要求输入两个整数,判断输出里面较大的那个值

           1.设计编译源程序代码

            

             2.使用gcc编译程序,使用含有-g选项的gcc命令,这样编译出的可执行代码中才包含调试信息,否则之后的gdb无法载入该可执行文件。

             3.进入gdb调试环境:gdb后面跟的是可执行文件

               

               4.使用gdb调试程序

                (1)查看源程序,在gdb中输入“l“就可以查看源程序,一次显示十行。

                

                 (2)使用”b"命令设置断点

                  (3) 使用命令“info b”查看断点信息

                    

                     (4)输入“r”可以运行程序

                     (5)输入“n”或“s”可以单步运行,它们的区别是,若有函数,调用时,“s”会进入该函数,“n'不会进入该函数

                     (6)输入”p 变量名“可以产看指定变量的值

                      

                     (7)在查看完变量或堆栈的情况后可以输入命令”c“恢复程序的正常运行,把剩余的程序执行完,并显示执行结果

                     (8)可以通过输入命令“q”,回车后退出gdb环境

                     


  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值