• linux程序机制入门


    GCC环境

    • 类debian系统运行 apt-get install build-essential 安装gcc环境。
    • 编写c语言程序后,运行 gcc ./hello.c 会得到一个名为 a.out 的文件,这就是编译后的可执行文件,执行 ./a.out 即可看到运行效果。

    gcc的帮手

    • gcc是一个套件,它依靠套件里的各个工具完成编译工作。
    • cpp 工具,负责预处理源代码文件,比如把 引用的 .h文件的内容拷贝过来,将定义的宏替换下来,可运行命令 gcc -E hello.c > hello_cpp.c 就会得到预处理后的文件。
    • 编译,运行 gcc -S hello.c 就会对 hello.c进行预处理和编译,从而得到 hello.s 文件,该文件里面是编译后的汇编代码。
    • 运行 gcc -c hello.c 就会对文件进行预处理,编译,汇编,最终得到 hello.o 的机器码,此时该文件就是一个elf格式的二进制文件了,需要运行 hexdump -C ./hello.o 来查看了。
    • ld 工具:负责把编译好的一堆机器码和它们依赖的库文件的机器码链接起来,组成一个可运行的程序,命令 gcc main.o part1.o -o myapp 就会将编译好的.o文件链接成一个可执行的程序 myapp.
    • 运行 gcc hello.c -o hello.out gcc会自动调用上面的4个工具,完成整个编译过程,最终得到一个可执行的hello.out 文件。

    GBD 调试程序

    • 类debian系统的安装命令: apt-get install gdb
    • 一般gcc编译出来的文件可以被gdb运行,但是由于没有和源代码关联,所以无法进行查看源文件,设置断点,查看变量等操作。使用 gcc -g hello.c 编译出来的则可以进行上述操作,因为-g参数将调试信息加入到目标文件了。
    • gdb常用命令: run/r 命令,gdb a.out 启动后并不会马上运行,需要输入run命令运行程序; break/b 命令,break 12 在第12行设置断点; list/l 命令,列出当前程序源代码;continue/c 命令,继续运行到下一个断点;print/p 命令,打印变量命令,如 print i 打印变量 i 的值; examine/x 命令,查看指定内存地址中的数据;next/n 命令,单步执行命令,执行该命令的下一条指令; q 退出gdb环境。

    make和Makefile

    • make 是一个程序,类似windows的批处理命令,可以执行一批操作,格式如下:
    目标:源
        执行的操作
    

    注意:执行的操作前面必须是一个tab键,不能是4个空格。

    Makefile示例

    • 假如我有三个文件 main.c, input.c, output.c ,要编译成 myapp,则可以写一个Makefile文件如下
    all:mian.o input.o output.o
        gcc main.o input.o output.o -o myapp
    
    main.o:main.c
        gcc -c main.c
    
    input.o:input.c
        gcc -c input.c
    
    output.o:output.c
        gcc -c output.c
    
    clean:
        rm ./*.o
        rm myapp
    
    install:myapp
        cp ./myapp /usr/bin/
    
    • 执行时,如果运行 make ,就会去找 all 这个目标,如果没有,就会执行第一行。
      当然,也可以指定具体的目标,如 make input.o

    Autoconf和configuration

    • debian下安装命令 apt-get install autoconf,会安装相应的组件。
    • Linux发行版五花八门,你发布的二进制软件不一定能在别的发行版正常安装和运行,所以在linux中一般以源码形式发布软件,同时源码中会附上针对特定发行版的 configuration 文件,这个文件就是用来在安装和运行该软件前检查系统环境的,比如是否有gcc编译器,版本是否符合,是否有运行该软件所依赖的库等等。
    • ldd ./myapp 会检查 myapp依赖的库。
    • 源码安装一般过程:1) 解压 app.tar.gz 或者 app.tat.bz2 2) 运行 ./configuration 和 make 命令

    Autoconf组成

    • Autoconf 就是用来生成 configuration 文件的,它其实是又4个工具组成的。

    • Autoscan ,运行 autoscan 会检查源码结构,生成configure.scan 和 autoscan.log,该文件需要我们再修改,并重命名为 configure.ac ,该文件主要描述源码结构及各个文件之间的关系,示例如下:

    # 项目主文件
    AC_INIT(main.c)
    
    #项目名称及版本号
    AM_INIT_AUTOMAKE(myapp,1.0)
    
    # 是否检查C编译器是否正常
    AC_PROG_CC 
    
    #运行configure最终要生成的文件
    AC_OUTPUT(Makefile)
    
    • Aclocal 对上面生成的configure.ac 做进一步细化,生成的文件为 aclocal.m4 ,该文件不需要修改。

    • Autoconf 根据 configure.ac 和 aclocal.m4 生成 configure 脚本。

    • 自己先手动编写 Makefile.am , 它是Makefile.in 的模板,Makefile.am文件内容示例如下:

    #是否检查源码目录下又GNU软件的标准文件,比如AUTHOR,NEWS, ChangeLog等文件。
    AUTOMAKE_OPTIONS=foreign
    #编译后的软件名为 myapp
    bin_PROGRAMS=myapp
    # 该项目包含哪些源文件
    myapp_SOURCES=main.c input.c output.c
    

    然后先运行 automake --add-missing 安装缺失的文件,最后运行 automake 就会生成 Makefile.in 了。

    • 最后把这些文件打包就可以了,其它用户下载后,运行 configure后就会根据Makefile.in 生成 Makefile, 然后用户就可以运行 make 命令编译和安装软件了。
  • 相关阅读:
    git pull fatal: refusing to merge unrelated histories
    Git报错:Your branch is ahead of 'origin/master' by 1 commit
    java读取大文件内容到Elasticsearch分析(手把手教你java处理超大csv文件)
    Java try catch语句块中try()的括号中代码作用
    Redis这15个“雷坑”,别问我咋知道的……
    MySql死锁
    MQ限流应用
    什么是 JWT -- JSON WEB TOKEN
    mybatis-plus查询指定字段
    数据库炸了----我就重启了一下啊(Communications link failure)
  • 原文地址:https://www.cnblogs.com/imap/p/7632533.html
Copyright © 2020-2023  润新知