当前位置: 代码迷 >> 综合 >> Linux下使用gcc生成静态库.a和调用(图文并茂,坑已踩完)
  详细解决方案

Linux下使用gcc生成静态库.a和调用(图文并茂,坑已踩完)

热度:30   发布时间:2024-01-27 06:17:37.0

简 述: 在Linux系统下,使用gcc来编译,生成静态库,且调用静态库.a文件,生成可执行程序。此处例子实际:使用g++9.2在mac平台下完成这个知识点的教程。 在 下一篇 踩坑生成动态库的.so制作和使用。

文章目录

      • 编程环境:
      • 静态库概念:
      • 前期铺垫:
      • 将.cpp生成.o:
      • 将.o生成.a:
      • 链接库,调用静态函数.a:
      • 运行可执行程序成功:
      • 源码下载:
      • 总结:

编程环境:

?: MacOS 10.14.6 (18G103) ? gcc/g++ 9.2.0


静态库概念:

静态库 是在可执行程序运行之前就已经加入到执行代码中,成为执行程序的一部分;静态库的后缀一般是 .a作为后缀。

库: 二进制文件;是加密之后的.c/.cpp的文件

静态库: .dll 或 .so


前期铺垫:

创建如下例子几个文件:注意是.cpp文件,里面写的也是c++的语法。


将.cpp生成.o:

  • 执行命令 g++-9 -c *.cpp 将所有.cpp 文件都编译不链接生成对应的.o;且将.o文件都存放于lib文件夹下。

     g++-9 -c *.cpp  //注意 -c 是小写,非大写mv *.o ./lib 
    

将.o生成.a:

  • 执行命令 ar cr libxxx.a ./lib/*.o 将所有的.o文件全部归档,然后替换创建为一个静态文件.a;ar 是GNU 归档工具,rcs 表示(replace and create)

    #用法:ar rcs 静态库的名字 原材料 
    #ar -archivear cr libxxx.a ./lib/*.o  //生成静态库文件.a
    mv *.h ./include          //将所有的.h文件放在include文件夹下
    mv libxxx.a ./lib         //将.a文件也放在lib文件夹下
    

    此时的工程结构如下:


链接库,调用静态函数.a:

  • 执行命令 g++-9 -I ./include -L ./lib -lxxx -o mainApp 调用生成的.a文件,并且链接,生成可执行程序mainApp

    • 注意,所要生成的.a文件的名字前三位必须是lib,否则在链接的时候,就可能导致找不到这个库
    • 命令规则: libxxx.a红色部分为固定的格式,中间的xxx才是库名
    • -l 为调用的库的名称(-l 后面没有空格,直接加库名)
    #-I 为指定的库的头文件的路径
    #-L 为指定的库的二进制文件文件
    #-l 为调用的库的名称(-l 后面没有空格,直接加库名)
    #-o 输出文件,生成的可执行程序的名称g++-9 -I ./include -L ./lib -lxxx -o mainApp
    
  • 此时工程的结构:

?

  • 运行成功可以查看.a文件里面的内容,本质是把其余的.o文件全部塞到了.a里面

    #成功之后,可以查看.a里面的包含具体的所有的.o文件 
    nm libmytest.a
    

运行可执行程序成功:

运行命令 ./mainApp,执行可执行程序,能够看到结果输出,表示成功。


源码下载:

04_01_a


总结:

看起来很简单,殊不知,纸上学来终觉浅, 还是亲自实现一番才以记忆深刻。若是成功的白嫖到了这篇文章,可以点个赞,给我留个言,鼓励一下。你的加油,我们持续不断的出新的文章,那啥,白嫖一时爽,一直白嫖一直 。?