Linux下C语言开发

Linux下C语言开发

  • Linux下C语言开发
    • Linux下C语言开发流程
    • C语言开发工具
    • LinuxC语言的编译器gcc
      • gcc 的安装和配置
      • gcc对c语言的处理过程
      • gcc的基础使用方法
    • Linux C语言的调试工具gdb
      • gdb的基础使用
      • gdb运行模式的选择
    • Linux C语言的项目管理工具make
      • make 项目管理器的基础
      • makefile中的变量
      • make项目管理器的使用
    • Linux中的C语言应用代码
      • C语言代码的运行机制
      • C语言代码的程序存储空间
      • C语言代码的main函数和参数
      • C 语言代码的出错处理
      • C语言代码的标准输入和输出函数
      • C语言代码的时间处理
      • C语言代码的分配机制
      • C语言代码的系统调用和库函数

Linux下C语言开发

Linux下C语言开发流程

  • 调试工具: 方便对C语言的目标代码进行调试

    GDB是绝大多数开发人员使用的调试器

  • 项目管理和维护工具: make 等是一种控制编译或者重复编译软件的工具,可以对C语言的程序源文件进行有效的管理

    • Vim

      1. vim的启动和退出

      2. vim 的工作模式及其切换

        三种模式的切换:

    • Emacs

      是一个集成开发环境

    • gedit

    LinuxC语言的编译器gcc

    gcc 的安装和配置

    在许多发行版中gcc默认安装,但是缺少常用的头文件和库文件。

    要安装 build-essential这个包

    apt-get 是ubuntu 下的软件管理命令,可以安装、删除、更新系统中的软件包

    install 是安装软件包

    系统在安装build-essential时,会把程序文件放入以下几个目录:

    • /usr/lib : 大部分的编译程序都放在这个目录。这里有编译需要的可执行程序,还有一些特定版本的库文件与头文件
    • /usr/bin/gcc: 指的是编译程序,即实际在命令中执行的程序。这个目录可供各个版本的gcc使用,只要利用不同的编译程序目录来安装就可以了
    • /usr/include : 这个目录及其子目录下包含程序所需要的头文件

    完成安装后,可以使用命令查看gcc的版本

    gcc 址: http://www.gnu.org/software/gcc 来了解gcc的最近发展

    关于centos安装相应包的说明:

    其他:

    Linux下C语言开发

    gcc对c语言的处理过程

    4个步骤:

    1. 预处理,C语言处理的第一阶段,gcc需要对C语言源文件中包含的各种头文件和宏定义进行处理,如:#define #include #if等
    2. 编译,根据源文件产生汇编语言,首先检查代码的规范性、是否有语法错误等
    3. 汇编, 将刚得到的汇编语言用于输入,产生.o 拓展名的目标文件
    4. 链接,各目标文件被gcc放在可执行文件的适当位置上

    预处理阶段产生预处理文件,后缀名为.i

    编译阶段,会生成汇编代码文件.s

    汇编阶段,将.s文件转换为目标文件.o

    默认gcc会到/usr/lib下查找库文件

    函数库有静态库和动态库两种

    • 静态库是指编译链接时,将库文件的代码全部加入可执行文件中,因此生成的文件比较大,但在运行时就不需要库文件了,其后缀名为.a
    • 动态库与之相反,在编译链接时并没有将库文件的代码加入可执行文件中,而是在程序执行时加载库,节省开销,一般动态库的后缀为.so

    gcc 在编译时默认使用动态库

    gcc的基础使用方法

    gcc基本使用格式

    gcc 可以通过选项对程序的生成进行全面控制,每个选线可以有多种值。

    常用选项:

    选项 说明
    -c 仅对源文件进行编译,不链接生成可执行文件。进行差错或只生成目标文件时可以使用
    -o filename 将经过gcc处理过的结果保存为filename,这个结果文件可以是预处理文件、汇编文件、目标文件或者最终的可执行文件。假设被处理的源文件为file1,如果这个选型被忽略,那么生成的可执行文件的默认名称为a.out,目标文件默认为file1.o,汇编文件默认名为file1.s,生成的预处理文件发送到标准输出设备stdout
    -g或-gdb 在可执行文件中加入调试信息,方便进行程序的调试,如果使用 -gdb 选项,表示加入gdb扩展的调试信息,以便使用gdb进行调试
    -O[0,1,2,3] 对生成的代码进行优化,括 中的部分为优化等级,默认为2级优化,0为不优化。优化和调试通常不兼容,不要同时使用-g 和-O选项
    -Idir 将dir目录加到搜索头文件的目录中,并优先于gcc缺省的搜索目录。在有多个-I 选项的时候,按命令行上-I的前后顺序搜索,dir可以使用相对路径
    -Ldir 将dir目录加到搜寻 -L选型指定的函数库文件的目录列表中,并优先于gcc缺省的搜索目录,在有多个 -L 的选项下,按 -L 的前后顺序搜索,可使用相对路径。
    -lname 在链接时使用函数库name.a, 链接程序在 “-Ldir”选项指定的目录下,以及”/lib”,“usr/lib” 下寻找该库文件。在没有使用”-static” 选项时,如果发现共享函数库name.so, 则使用 name.so进行动态链接。

    gcc命令可以组合使用,不过每个命令选项都要有一个自己的连字符”-“

    在Linux下生成的可执行文件没有固定的拓展名。


    gcc命令中的第2部分是一个输入给gcc命令的文件。gcc通过输入文件的拓展名来确认文件类型。

    gcc支持的与c语言相关的输入文件类型

    拓展名 类型
    .c c语言源程序
    .C, .cc ,.cp,.cpp,.c++,.cxx C++语言源程序
    .i 预处理后的C语言源程序
    .ii 预处理后的C++源程序
    .s 预处理后的汇编程序
    .S 未预处理的汇编程序
    .h 头文件
    .o 编译后的目标代码
    .a 目标文件库

    可执行文件,通常以绿色在终端中显示。

    实际开发中,常将主函数和其他函数放在不同文件中。

    例: 对两个c语言文件进行编译,并且链接生成可执行文件

    Examhellosun.c是一个函数的实现文件

    Examhello.c 是一个有主函数的文件,且调用了Examhellosum.c中的函数(有头文件)

    Linux C语言的调试工具gdb

    GBK调试程序,主要提供的功能:

    • 监视程序中变量的值
    • 设置断点以使程序的指定的代码行上停止执行
    • 一行行的执行代码

    gdb的基础使用

    gdb是在Linux安装时自带的,在命令行上输入”gdb” 会启动gdb调试环境

    gdb的功能很强大,包括从简单的文件装入到允许检查所调用的堆栈内容的复杂命令。

    使用gdb调试时会用到的一些常用命令:

    命令 说明
    file 装入想要调试的可执行文件
    kill 终止正在调试的程序
    list 列出产生执行文件的部分源代码
    next 执行一行代码,但不进入函数内部
    step 执行一行源代码并且进入函数内部
    run 执行当前被调试的程序
    quit 退出gdb
    watch 动态监视一个变量的值
    make 不退出gdb而重新产生可执行文件
    call name(args) 调用并执行名为name,参数为args的函数
    return value 停止执行当前函数,并将value返回给调用者
    break 在代码里设置端点,使程序执行到此处被挂起

    通常来说,调用gdb只需要一个参数,其标准格式:

    如果程序运行时产生了错误,会在当前目录下产生一个核心内存映像core文件,可以在指定执行文件的同时为可执行文件指定一个core文件:

    还可以为要执行的文件指定一个进程 PID:

    当gdb运行时,把任何一个不带选项前缀的参数都作为一个可执行文件、core文件或被调试程序相关关联的进程 。

    不带任何选项前缀的参数和前面加了 “-se”或”-c”选项的参数效果相同。

    gdb把第一个前面没有选项说明的参数看作前面加了”-se”选项,也就是需要调试的可执行文件并从此文件里读取符 表,如果有第2个前面没有选项说明的参数,将被看作是跟在”-c”选项后面,也就是需要调试的core文件名。

    如果不希望看到gdb开始的提示信息,可以用 “gdb -silent”执行调试工作。

    输入”gdb -help”或”-h” 可以得到gdb启动时的所有选项提示。

    gdb命令行中的所有参数都按照排列的顺序传给gdb,除非使用了”-x”参数。

    gdb的许多选项都可以使用缩写的形式代表,也可以用”-h” 查看。

    在gdb中也可以采用任意长的字符串代表选项,只要保证gdb能唯一的识别此参数就可。

    gdb中一些常用的参数选项:

    选项 说明
    -s filename 从filename指定的文件中读取要调试的程序符 表
    -e filename 执行filename指定的文件,并通过与core文件进行比较来检查正确的数据
    -se filename 从filename中读取符 表并作为可执行文件进行调试
    -c filename 把filename指定的文件作为一个core文件
    -c num 把数字num作为进程 和调试的程序进行关联,与attach命令相似
    -command filename 按照filename指定的文件中的命令执行gdb命令,在filename指定的文件中存放着一系列的gdb命令,就像一个批处理
    -d path 指定源文件的路径,把path加入到搜索源文件的路径中
    -r 从符 文件中一次读入整个符 表,而不是使用默认的方式首先调入一部分符 表,当需要时再读入其他部分。这会使gdb的启动较慢,但可以加快以后的调试速度。

    gdb运行模式的选择

    gdb提供了包括”批模式”或”安静模式”在内的一系列运行模式,可以通过gdb运行时在命令行中通过选项来选择

    gdb运行模式的相关选项:

    选项 说明
    -n 不执行任何初始化文件中的命令(一级初始化文件就称为.gdbinit)。一般情况下在这些文件中的命令会在所有的命令行参数都被传递给gdb后执行。
    -q 设定gdb的运行模式为“安静模式”,可以不输出介绍和版权信息,这些信息在“批模式”中也不会显示。
    -batch 设定gdb的运行模式为“批模式”,gdb在“批模式”下运行时,会执行命令文件中的所有命令,当所有命令都被成功执行后gdb返回状态0,如果在执行过程中出错,返回一个非0值。
    -cd dir 把dir作为gdb的工作目录,而非当前目录(gdb缺省时把当前目录作为工作目录)

    使用gd

    声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

    上一篇 2022年1月15日
    下一篇 2022年1月15日

    相关推荐