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中文件内容的顺序:

总目标:总目标的依赖
    使用依赖生成目标的命令
分支目标:分支目标的依赖
    使用依赖生成目标的命令

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

5.变量 :

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

6.进阶使用

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

案例使用方法:

4---Linux:gcc,g++编译/制作并调用静态库,动态库/makefile_第1张图片

         优化后:

4---Linux:gcc,g++编译/制作并调用静态库,动态库/makefile_第2张图片

五、其他操作

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

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

   #endif

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

你可能感兴趣的:(Linux,linux)