• 4---Linux:gcc,g++编译/制作并调用静态库,动态库/makefile


    一、代码常识

    写代码:
        编辑器         编辑 源程序文件  *.c *.cpp *.py *.sh *.java
        编译器        把源程序文件  翻译成   可执行程序文件
                源程序文件    中文(自然语言)  编程语言(C C++)
                            翻译 --> 机器语言   
        调试器        断点调试
                        其他工具     spy++ ...

    俗称的编译器其实应该叫  集成开发环境IDE     vs vsCode QtCreator

        GNU :GNU  is Not  Unix
            gcc   g++   GDB

    二、gcc命令

    预处理:
            gcc -E *.c  
            g++ -E *.cpp
            gcc -E *.o -o 

        执行所有的预处理指令中完成:
                    ①头文件引入
                    ②宏展开
                    ③预处理指令执行
                          #pragma 
                          #if 

    编译:
           ① gcc -c *.c         只编译
                    生成目标文件(elf文件 机器语言)
                    windows上是 *.obj

                    编译的好处:协同合作(多人同时工作  单独编译 )

            ②gcc -S *.c     生成汇编

                    逆向 :汇编   反汇编  。。。

    链接:
            gcc *.o 

    三、制作并调用静态库和动态库

    1.现成的:
            windows上:
                #include 添加头文件  ->.h
                #pragma comment(lib,"*.lib")         加载库->存放实现部分
            linux:
                #include 添加头文件                   /usr/include   
                加载库   链接的时候   加 -l选项       /lib /usr/lib

     2.自己制作:
             windows上:
    vs 建动态库静态库工程

              Linux上:

       制作静态库
        1. 仅编译生成目标文件

    gcc -c *.c -o *.o

        2. 通过目标文件生成 静态库文件  

            lib名称lib的命名方式是传统,后缀记得是.a

    ar rc lib*lib.a *.o

    使用静态库
        1. 使用当前文件夹下的  像使用 目标文件*.o 一样使用   

    gcc *.o lib*lib.a -o *.exe

       2. 自己做的一般保存在/opt目录下

    gcc *.o -L /opt -l *lib

            -L 指定路径
            -l 指定目录名

    制作动态库:(直接用源文件.c  ->.so文件)

    gcc -shared *.c -o lib*lib.so

    使用动态库:
        1. 使用当前文件夹下的  像使用 目标文件*.o 一样使用

    gcc lib*lib.so

      2. 自己做的一般保存在/opt目录下

     gcc *.o -L /opt -l *lib

    例如 : math.h里的函数 sqrt

    gcc *.c -l m

    仅仅是#include是相当于只有声明,即.h   ----->实现部分需要-l去链接 

    3.优缺点分析

            静态链接库:
                链接的时候把源代码拿过来  在生成的可执行程序文件里边
            动态链接库: 
                运行的时候把源代码拿过来  不在生成的可执行程序文件里边

                   动态库优点:

                    1. 让可执行程序文件相对比较小
                    2. 灵活!!!

                  动态库缺点:
                       依赖库文件

    四、makefile的基本使用(多文档编程)

    1.makefile:自动化编译脚本
               类: cmake qmake

    2.基本的格式:

            ①#注释

            ②makefile中文件内容的顺序:

    1. 总目标:总目标的依赖
    2.     使用依赖生成目标的命令
    3. 分支目标:分支目标的依赖
    4.     使用依赖生成目标的命令

    3.makefile 写好后  使用make命令即可
    4.清理命令 :
        make clean(需要先在makefile文件中写好clean相关的指令。(见下面的案例))

    5.变量 :

            和shell脚本的变量一样 直接使用
            取值同样用$

    6.进阶使用

            $@ 目标
            $< 依次的依赖   
            %  匹配多个名字

    案例使用方法:

             优化后:

    五、其他操作

    1. 终端命令:PS1=[^o^]  将前面的路径显示成[^o^]

    2.防止头文件重复包含
       #ifndef _JIA_H_  
       #define  _JIA_H_

       #endif

    3.在终端强行结束当前运行的命令--->ctrl+C

  • 相关阅读:
    Java顺序表和链表
    C# 11新特性之原始字符串
    WS-FLV直播协议分析
    职场人如何高效备考PMP?(建议收藏)
    【CANN训练营】UART、SPI、I2C串口通信介绍笔记
    后端接口的查询方式
    注释那些事
    牛客 NC25020 [USACO 2007 Nov S]Cow Hurdles
    Python-装饰器
    spring boot零配置
  • 原文地址:https://blog.csdn.net/zjjaibc/article/details/126598309