静态库和动态库的创建

概念简要:

静态链接:在编译期将.a库中的代码直接打包到可执行文件,不依赖外部库,可独立运行
相当于程序在编译期就将静态库融入进可执行程序中

动态链接:在编译期间,只保留函数符号,相当于只有函数的声明;在运行期通过动态链接器(会加载函数具体的功能)加载 .so/.dll库,程序中只存在函数符号的引用,而非实际代码

创建静态库

这是main文件

#include <iostream>
#include "math.h"
int main()
{	int a,b;
	std::cin>>a>>b;
	int c = add(a,b);
	std::cout<<c<<"\n ";
	return 0;
}

这是math.h文件

#ifndef __MATH_H__
#define __MATH_H__
int add(int a,int b);

#endif
这是函数的具体实现功能文件
#include "math.h"
int add(int a,int b)
{
	return a + b;
}

注意,此时为什么我们需要创建静态库,是因为我们不想让别人知道我们这个函数具体实现的代码,防止人家恶意篡改
所以我们需要创建静态文件
先把 math.cpp 文件 编译成 .o 文件,用g++ -c math.cpp math 命令你就可以看到该文件目录下有 math.o 文件了
再把 math.o 文件 通过 ar rcs libmath.a math.o 命令变成静态库的形式,由此我们的静态库就创建好了
这时候我们删掉原来的math.cpp文件,然后链接上我们的静态库即可,g++ main.cpp -L. -lmath
-L是文件路径,当前文件路径就是 .,后面再加上你想链接的库


动态库的创建

再回到我们上面创建文件的地方
这是main文件

#include <iostream>
#include "math.h"
int main()
{	int a,b;
	std::cin>>a>>b;
	int c = add(a,b);
	std::cout<<c<<"\n ";
	return 0;
}

这是math.h文件

#ifndef __MATH_H__
#define __MATH_H__
int add(int a,int b);

#endif
这是函数的具体实现功能文件
#include "math.h"
int add(int a,int b)
{
	return a + b;
}

还是一样把 math.cpp 转换成 .o文件 ,但是值得注意的是,转换文件的时候要加上 -fPIC意思是生成位置无关的代码,保证动态库可以被运行时装入任意地址,没有 -fPIC 去生成的.o文件仅适用于静态链接
那么我们用 g++ -FPIC -c math.cpp 生成了相应的 math.o 文件,再用g++ -shared -o libmath.so math.o 生成动态库,由此创建好了动态库,看,动态库是shared,就说明他是任何一个程序都可以共用的,只要在运行时 加载相应的功能代码即可
这里有一个及其重要的一点,此时,你直接去执行可执行文件是出错的!!!! 因为程序不知道你的动态库文件放在哪里了,此时我们需要告诉他动态库文件的位置,用export LD_LIBRARY_PATH=.即可

posted @ 2026-01-28 15:12  Alaso_shuang  阅读(0)  评论(0)    收藏  举报
2 3
4