简 述: 在Linux系统下,使用gcc来编译,生成静态库,且调用静态库.a文件,生成可执行程序。此处例子实际:使用g++9.2在mac平台下完成这个知识点的教程。在 下一篇 踩坑生成动态库的.so制作和使用。
[TOC]
本文初发于 “偕臧的小站“,同步转载于此。
编程环境:
💻: MacOS 10.14.6 (18G103)
📎 gcc/g++ 9.2.0
静态库概念:
静态库 是在可执行程序运行之前就已经加入到执行代码中,成为执行程序的一部分;静态库的后缀一般是 .a
作为后缀。
库: 二进制文件;是加密之后的.c/.cpp的文件
静态库: .lib 或 .a
前期铺垫:
创建如下例子几个文件:注意是.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 -archive ar 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
,执行可执行程序,能够看到结果输出,表示成功。
源码下载:
总结:
看起来很简单,殊不知,纸上学来终觉浅, 还是亲自实现一番才以记忆深刻。若是成功的白嫖到了这篇文章,可以点个赞, 给我留个言,鼓励一下。你的加油,我们持续不断的出新的文章,那啥,白嫖一时爽,一直白嫖一直 。🥺