• gcc编译, gdb调试, makefile写法


    //test.c:

    #include <stdio.h>

    int main(void)

    {

      printf("hello world!");

      return 0;

    }

    ======================================

    一、

    1. 编译过程:预处理(processing)-》编译(compilation)-》汇编(assembly)->Linking

    2. 预处理:

    gcc -E test.c -o test.i  /  gcc -E test.c

    预处理的结果就是将stdio.h文件中的内容插入到test.c中

    3.编译为汇编代码:

    gcc -S test.i -o test.s

    -S选项表示生成汇编代码, -o表示输出汇编代码文件。

    4. 汇编:

    gcc -C test.s -o test.o

    汇编器将汇编代码编译成目标文件

    5. 链接:

    gcc test.o -o test

    二、

    1.对多个文件进行编译:

    gcc test1.c test2.c -o test

    2.检错

    gcc -pedantic illcode.c -o illcode

    -pedantic 帮助程序员发现不符合ansi/iso标准代码。

    -Wall 使gcc产生尽可能多的警告信号

    -Werror会在警告的地方停止编译,迫使程序员对自己代码进行修改

    三、库文件的链接:

    函数库是由一些头文件(.h)和库文件(.so, .lib, .dll)的集合。 LINUX默认将头文件放在/usr/include/, 库文件放在/usr/lib/; 如果我们要用的库不在这些目录下,所以在gcc编译的时候必须用自己的办法来查找所需要的头文件和库文件。

    例: test.c链接mysql,我们要下载mysql的库——MySQL Connectors, 下下来以后由个include的文件夹, 里面包含头文件, 还有一个lib的文件夹,里面包含二进制so文件libmysqlclient.so,其中include的路径是/usr/dev/mysql/include, lib的文件夹是/usr/dev/mysql/lib

    1. 编译成目标文件:

    gcc -c -I /usr/dev/mysql/include test.c -o test.o

    2. 链接:最后我们把所有的目标文件链接成可执行文件。

    gcc -L /usr/dev/mysql/lib -lmysqlclient test.o -o test

    linux下动态链接库用so结尾,静态链接库由a结尾。

    3.强制链接时使用静态链接库:

    加-static

    gcc -L /usr/dev/mysql/lib -static -lmysqlclient test.o -o test

    静态库搜索顺序

    (1). ld 会去找gcc命令中参数-L

    (2)再找gcc环境变量library_PATH

     (3)再找内定目录/lib, /usr/lib, /usr/local/lib

    动态链接搜索顺序:

    (1)编译目标代码时候指定的搜索路径

    (2)环境变量LD_LIBRARY_PATH

    (3)配置文件/etc/ld.so.con

    (4)/lib, /usr/lib

    GDB调试:

    1. gcc -g main.c -o main

    在用gcc时候,加上-g表示在生成的目标文件中加入源代码信息以便调试

    2. l, list 从第一行开始列出源代码

    3. start, 开始执行程序,第一行break

    4. n, next下一行

    5. s, step进入函数

    6. bt, backtrace查看函数栈

    7. i locals, 用info命令查看局部变量

    8. f 1, 到栈帧1

    9. p sum, print出sum的值

    10. finish, 运行到返回点——如果是从s进来的函数

    11. set var sum=0, 调试过程中给变量sum赋值

    12. p result[2]=33, 用p赋值

    13. display sum, 每次程序停止的时候显示sum的值

    14. b, break当前的循环

    15. b 9, 在第9行设置断点

    16. c, 连续运行continue

    17. i breakpoints, 查看所有断点

    18. delete breakpoint 2, 删除断点2

    19. disable breakpoint 2 , 禁用断点2

    20. enable breakpoint 2 , 启用

    21. break 9 if sum!=0 , 当满足条件时候断点激活

    22. r , 从头开始执行run

    Makefile基础:

    1. Makefile 是由一组rule组成, 每条rule信息如下:

    target ...: prerequistites ...

    <tab>command1

    <tab>command2

    例:

    main: main.o stack.o maze.o

      gcc main.o stack.o maze.o -o main

    只要有一个prerequisities更新了,目标也会被更新,就是执行command

    2. clean规则

    用于清除编译产生的二进制文件,保留源文件:

    clean:

      @echo "cleaning project"

      -rm main *.o

      @echo "clean completed"

    如果命令前加@则不显示命令本身,只显示结果。 如果加-表示即使命令出错也不会停止。 通常rm或者mkdir前面要加-,因为可能没有这个文件,或者已经有了这个文件。

    如果存在有文件名字就叫做clean,则会出错,那么就要添加一行,将clean关键字申明成伪目标

    .PHONY:clean 

    3. 4个规则关键字:

    install:将可执行文件、配置文件、docs分别拷贝到不同安装目录

    all:执行主要编译工作,通常用作缺省目标

    clean:删除编译生成的二进制文件

    distclean:不仅删除二进制文件,还删除其他的,只留下源文件。

    4. 隐含规则和模式规则:

    其中有一条

    %.o: %.c

      $(compile.c) $(output_option) $<

    $@为规则中的target, $<为规则中的第一个条件,上面那句相当于 cc -c $@ $<

    进而相当于所有符合这样的依赖关系:

    main.o:main.h statk.h maze.h

    可以隐含

    main.o: main.c

      cc -c o main.o main.c

    5. 变量:

    main.o: main.c

      $(CC) $(CFLAGS) $(CPPFLAGS) -c $<

    CC = gcc

    CFLAGS = -o -g

    CPPFLAGS = -Iinclude

    :=, 立即赋值

    ?=, 如果没有赋过值才进行赋值

    +=, 追加赋值

    $^, 表示将所有条件组成的列表

    $?, 表示所有比目标新的条件组成的列表

    6. 自动处理依赖关系:

    例:

    all: main

    main: main.o stack.o maze.o

      gcc $^ -o $@

    clean:

      -rm main *.o

    .PHONY: clean

    sources = main.c stack.c maze.c

    include $(souces: .c = .d)

    %.d: %.c

      set -e; rm -f $@;

      $(CC) -MM $(CPPFLAGS) $< > $@.$$$$;      # $$$$相当于两个$ , 表示进程

      ....略...

          

  • 相关阅读:
    (原创)sqlite封装库SmartDB1.3发布
    合索引 与 单一列的索引
    Sql中CHARINDEX用法
    Eclipse 的快捷键以及文档注释、多行注释的快捷键
    JAVA 方法或者类的注释快捷键
    关于/r与/n 以及 /r/n 的区别总结
    c#中Split 分离字符以及空格消除方法
    C#生成Guid的几种方式
    MVC ViewBag和ViewData的使用
    软考之高级系统架构设计师(包含历年真题详解+课本教程+论文范文+视频教程)
  • 原文地址:https://www.cnblogs.com/bubbler/p/3915931.html
Copyright © 2020-2023  润新知