什么是gcc?

GCC(GNU Compiler Collection,GNU编译器套件),是由 GNU 开发的编程语言编译器

GCC 原名为 GNU C 语言编译器(GNU C Compiler),因为它原本只能处理 C语言。GCC 很快地扩展,变得可处理C++。后来又扩展能够支持更多编程语言,如Fortran、Pascal、Objective-C、Java、Ada、Go以及各类处理器架构上的汇编语言等,所以改名GNU编译器套件(GNU Compiler Collection)


GCC编译的四个阶段

0e21ce51f4b57d554e1848a32eb7991.png

 

gcc的参数:

-I 指定头文件目录

-D 预定义宏

-o 生成目标文件

-O 编译优化

-c 只编译子程序

-E 生成预处理文件

-g 包含调试信息

-Wall 提示更多警告信息

-v 查看版本号



静态库的制作

1.命名规则:

       lib + 库的名字 + .a  如libTest.a


    2.制作步骤:

       ①生成对应的 .o 文件  

        gcc test.c –c 

       ②将生成的 .o 文件打包

        ar rcs + 静态库的名字(libTest.a) + 生成的所有 .o 文件


    3.发布和使用静态库 

      发布静态库的时候把静态库目录 (lib) 和头文件目录 (include) 一起打包

      使用静态库

    gcc  main.c  -Iinclude(指定头文件目录)  -L  lib(连接静态库目录)  -l  Test(要使用的lib名) –o app


     4.静态库的优缺点

    优点:

      1.发布程序的时候,不需要提供对应的库

     2.加载库的速度快

    缺点:

     1.库被打包到应用程序中,导致库的体检很大

     2.库发生了改变,需要重新编译程序

    

共享库(动态库)的制作

    1.命名规则:

       lib + 名字 + .so


    2.制作步骤

       ①生成与位置无关的代码

         gcc –fPIC –c *.c -I ./include

      ②将.o文件打包成共享库

         gcc -shared -o libTest.so *.o -I ./include


    3.使用动态库

       gcc  main.c  -Iinclude(指定头文件目录)  -L  lib(连接静态库目录)  -l  Test(要使用的lib名) –o app


     4.解决程序运行时动态库无法被加载的问题

         ldd app(查看可执行程序的依赖的动态链接库的信息)

       ①直接将 lib 复制到 /lib (不允许使用,别用)

      ②测试动态库,临时设置lib环境变量

          export LD_LIBRARY_PATH=./lib

        终端关闭后,不生效

      ③永久性设置 lib 环境变量(不常用)

        cd 

        vim .bashrc

         最后一行追加 export LD_LIBRARY_PATH xxx/xxx/xxx/lib

         .bashrc修改后,重启终端才可生效

       ④找动态链接器的配置文件

        cd /etc

        把动态库lib的绝对路径追加到配置文件中

        vim ld.so.conf

        xxx/xxx/xxx/lib

        更新配置文件使其生效

        sudo ldcongif -v(查看信息)


     5.动态库的优缺点:

       优点:

         1.执行程序体积小

       2.动态库更新了,不需要重新编译程序

      缺点:

       1.发布程序的时候,需要将动态库提供给用户

       2.动态库没有被打包到应用程序中,加载速度相对较慢(与静态库相比)