C语言 NOTE11

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

Makefile编写:

makefile文件在编译的时候可以节省编译时间,原因是它根据文件的是否更新过才编译,没有更新过的文件不进行编译。

  • 目标:依赖(没有依赖时为为目标,例如clean:)
  • 定义变量:变量名 = 内容
  • 使用变量:$(变量名) , $@为目标 , $^为所有依赖 , $<为第一个依赖
  • 函数patsubst: $(patsubst %.c, %.o, $(SRC)) 意思是将所有SRC所指的所有.c文件替换成,o文件
  • 函数wildcard: $(wicard ./*.c) 意思是匹配当前目录下所有.c文件
TARGET 			=./bin/main
SRC				=$(wildcard ./src/*.c)
OBJ				=$(patsubst %.c, %.o, $(SRC))
CC				=gcc
CONFIG 			=-I./inc -L./lib -l库名
$(TARGET):$(OBJ)
	$(CC) $^ -o $@ $(CONFIG)
%.o:%.c
	$(CC) $< -o $@  -c $(CONFIG)

clean:
	rm $(TARGRT) $(OBJ)

  • 输入make 即可编译文件,这种情况适用于工程文件源文件很多的时候。
  • 工程文件一般包含src,lib,inc,bin,pic等目录

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

静态库和动态库:

为什么要将代码封装成库,后期制作的时候不希望对方知道源码,但对方可以使用封装好的函数,这时候就需要库,其次方便归档。

  • 如何生成静态库:
  • 1.将源文件编译成.o文件:
gcc -o model.o -c model.c
  • 2.将.o文件做成静态库:格式:(lib库名.a-----例如libmodel.a ,其中model 就是库名)
    ar为归档命令生成静态库,c表示如果要生成新的静态库不要警告,r代替库中现有的文件或者插入新的文件,v 输出详细信息。
ar crv libmodel.a model.o
  • 3.编译程序 gcc ­o main main.c ­-L库路径 ­-lmodel (静态库编译的时候要 ,运行的时候不需
    要)

  • 如何生成动态库:

  • 1.把源文件编译成.o文件

gcc   -fPIC   -o  model.o  -c  model.c     (-fPIC生成文件与地址无关)
  • 2.把.o文件打包成动态库
gcc  -shared  -fPIC  -o libmodel.so  model.o
  • 3.使用动态库编译程序
gcc -o main main.c -L./ -lmodel

运行时会报错,找不到动态库路径:解决如下

1. export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$(pwd)  ---在当前路径下设置库环境变量(临时设置)
2. 或者将libmodel.so 复制到系统/lib目录下

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

GDB调试:

1.安装gdb调试工具:sudo apt-get install gdb
2.编译程序时加上-g :

gcc  -o  main  main.c  -g

3.调试程序:gdb main

  • 基本命令:
    list 行号----》l ----- 显示代码10行
    r ------运行run
    s ------单步运行调试(遇到函数会进入)step
    n -----单步调试(不会进入被调用的函数内部)next
    b 行号 ------设置断点
    c ------当遇到断点停下后继续运行
    p 变量 ----输出变量信息

  • 设置条件断点
    b 16 if i==8 在16行设置断点,并且当 i ==8的时候才断点生效

  • 设置观察点 -----程序调试运行后遇到断点停下来才可以设置观测点
    watch 变量名称 —设置观察点(当变量值有变动的时候就会停止)

发布了52 篇原创文章 · 获赞 2 · 访问量 2023

猜你喜欢

转载自blog.csdn.net/weixin_42191545/article/details/103086976