1.准备

作者: tiube00001 | 来源:发表于2019-08-11 17:10 被阅读0次

    gcc使用

    1.gcc编译流程:
    1)预处理:gcc -E
    2)编译:gcc -S
    3)汇编:gcc -c
    4)链接:没参数
    5)其他参数:-o:指定输出名字,-D:编译时定义宏,-I:指定头文件,-g:gdb调试,-O:编译优化,可选(1-3),-Wall:输出警告信息

    静态库

    1.命令规则:lib+静态库的名字+.a,(lib是规范前缀,.a是规范后缀)。eg:libmytest.a
    2.制作方法:
    1).生成一个或多个.o文件,
    2).将.o文件打包:ar rcs libmytest.a one.o two.o。(ar是打包工具,rcs是命令,libmytest.a是包名,剩下的是.o文件)
    3.发布静态库
    1).发布静态库
    2).给出头文件
    3.使用静态库:gcc test.c -l hello -L. -static -o hello.static ,以.o文件为单位抽取库里面的文件使用,而不是把整个库一起编译进去
    4.静态库的优点:
    1).发布程序时,不需要提供对应的库
    2).程序执行时,加载速度快
    5.静态库的缺点:
    1).库很大
    2).库发生变化,需要重新编译

    动态库

    1.命令规则:lib+动态库名字+.so
    2.生成动态库
    1).生成与位置无关的.o文件:gcc -fPIC -c *.c
    2).打包成动态库:gcc -shared -o libMytesst.so *.o -I include
    3.使用动态库
    1).gcc main.c lib/libMytest.so -o app -I include
    2).gcc main.c -I include -L lib -l Mytest -o app
    3).ldd命令:查看程序依赖的所有动态库
    4.解决无法打开动态库的错误,问题核心是:动态库所在位置没有设置环境变量,所以无法找到动态库
    1).将动态库放入系统的lib目录(实际坚决不用)
    2).系统默认的动态库目录由环境变量:LD_LIBRARY_PATH,只需要将动态库所在路径加入这个环境变量(可用)
    3).修改:/etc/ld.so.conf文件,将动态库所在路径加入到文件中(推荐)
    4).修改家目录的.bashrc代码,加入export环境变量导入语句(不常用)
    5.动态库的优点:
    1).可执行程序小
    2).只要函数接口不变,动态库发生变化,不用重新编译程序
    6.动态库的缺点:加载慢,程序执行前,需要准备好动态库

    gdb简单使用:

    1.gdb app,调试程序app,进入调试界面
    2.命令:l,默认查看main.c文件,l filename.c,查看指定的文件,l filename.c:funcion_name:查看指定文件的函数代码,l filename:行号:查看指定文件的行
    3.命令:break 22:在22行打断点(简写:b 22),可以连续打断点。(断点不能停在for循环上)
    4.命令:b 22 if i =15,当变量i=15时,代码才停止,条件断点
    5.命令:info bbreak:查看断点信息,(简写:i b),info display:获取追踪变量编号(i d)
    6.命令:

    start:开始执行程序,(run命令也是一样,(简写:r))
    n:继续执行一步,不可进入函数体内部
    c:直接执行至断点,
    s:也是继续下一步,它可进入函数体内部,
    l:可查看函数体内部代码,
    p 变量名:查看变量的值,
    ptype 变量名:查看变量的类型,
    dispalay 变量名:追踪变量的值变化,
    undisplay 追踪编号:取消某个变量的追踪
    u:跳出单次循环
    delete 断点编号:删除断点
    finish:跳出函数,(跳出前,必须先删除函数内部的所有断点)
    set var i = 10:直接设置变量i的值为10
    quit :退出调试
    

    Makefile

    1.命名方式:makefile或者Makefile
    2.Makefile规则三要素:目标,依赖,命令
    示例:app:main.c
    [tab] gcc main.c -o app
    3.makefile分开编译,哪个被修改了才编译,不修改的不编译

    app:main.o, one.o
        gcc main.o one.o -c app
    main.o:main.c
        gcc -c main.c
    one.o:one.c
        gcc -c one.c
    

    4.makefile示例

    #行注释符
    #变量定义
    #obj = main.o one.o
    #函数:获取当前目录中所有的.c文件名
    src = $(wildcard ./*c)
    #将:src中的,所有.c文件名,替换成.o,参数之间要用逗号隔开
    obj = $(patsubst ./*.o, ./*.c, $(src))
    target = app
    CC = gcc
    #CC这种大写的变量是makefile自身维护的变量,值可修改
    $(target):$(obj)//变量使用$(var)
         #$(CC) $(obj) -o $(target)
        $(CC) $^ -o $@,
        #$^表示所以依赖,$@表示目标,$<表示第一个依赖,它们是自动变量,只能用于命令中
    %.o:%.c
    #%表示匹配依赖
        $(CC) -c $^ -o $@ 
    .PHONY:clean #声明目标clean为伪目标,之后就不会做更新比较
    clean:
    #命令前面加一个:-,表示忽悠错误,继续向下执行
        -rm $(obj) $(target) -f #书写一个与终极目标无关的目标,make clean手动调用目标,执行目标下面的命令
    

    相关文章

      网友评论

          本文标题:1.准备

          本文链接:https://www.haomeiwen.com/subject/wuysyftx.html