了解与制作动态库与静态库
动态库与静态库
这一节我们讲库的两种形式静态库和动态库,并讲解其的原理和如何被制作的。
本文章演示的操作系统为windows,编译环境为MinGW,IDE为clion,在不同环境下操作过程会有所些许差异请注意)。
1.静态库的制作
1.1.源码



我们在demo1文件下创建了一个main.cpp文件和一个math文件夹并在math文件夹下创建了
Mymath.cpp和Mymath.h,在Mymath.h声明了四则远算函数并在Mymath.cpp中实现。
1.2.制作过程
- 在math目录下执行以下操作命令行操作
g++ -c Mymath.cpp -o Mymath.o
ar rcs libstaticMymath.a Mymath.o
“ar rcs libstaticMymath.a Mymath.o ”的作用是用我们生成的Mymath.o目标文件生成名为libstaticMymath.a的静态库文件
在main.cpp根目录下执行以下命令行操作
g++ -o teststatic main.cpp -Lmath -lstaticMymath
" g++ -o teststatic main.cpp -Lmath -lstaticMymath"的作用是将mainn.cpp进行编译操作并与libstaticMymath.a静态库文件库文件进行链接操作生成.exe文件。
“-o” 是 output 的缩写,"teststatic"生成目标文件名
“main.cpp"是核心输入文件,”-L"作用是告诉链接器:除了系统默认的库目录外,额外去指定目录查找库文件;math 是相对路径,即当前工作目录下的 math 子文件夹
"-l"GCC 有固定命名约定:写 -lxxx 时,链接器会自动按规则匹配文件名,去搜索路径中查找 libxxx.a(静态库),我们命名库文件一lib开头是适应链接库的简写语法。
最后执行
./teststatic

运行成功
1.3.静态库特点
静态库进行链接是会把库中的所有函数实嵌入到存到链接生成的.exe文件中,这会导致我们将外部的.o库文件进行更行或者删除是不会游戏.exe文件,我们想获得最新版的库文件时需要重新编译链接
在我们只有一个库的时候不明显,但当我们的项目有很多库文件时,这个编译链接过程就会很费时。
动态库的制作
1.1.源码
与静态库的制作的初始代码相同
1.2.制作过程
- 在math目录下执行以下命令行操作(第二和第三行命令在不同编译环境下是不同的,当前演示实在MinGW环境下进行)
g++ -c -fPIC Mymath.cpp
g++ -shared -o libsharedMymath.dll Mymath.o
g++ -shared -o libsharedMymath.dll.a Mymath.o
生成.dll动态链接库和.dll.a动态库导入库,.dll动态链接库保存函数的具体实现,.dll.a动态库导入库仅在编译时使用告诉.exe文件.dll中文件函数实现的地址。
- 在根目录下执行链接操作
g++ -o testshared main.cpp -Lmath -lsharedMymath
./testshared
但当我们尝试执行时会发现执行不了
在clion终端中没给我们错误提示,我们直接手动执行.exe文件
从报错提示中我们可以知道原因是找不到.dll.a动态库导入库,正如我们上一节所说
g++在启动时自动搜索其自带的库的文件目录,我们可以知道C++标准库是以动态库的
形式存在的,而我们自己编写的动态库函数也得告诉.exe文件我们的库函数在哪里。
MinGW自动搜索顺序为:1.可执行文件同目录
2.环境变量中PATH里的所有路径
本节只讲第一种解决方法:放到可执行文件同目录下,第二种方法我在下一节讲环境变量时再讲。
直接把.dll.a放到与.exe同目录下就解决了。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)