创建动态库:
编写源文件:
// sub.h 显式调用
#include <iostream>
extern "C" int sub(int a, int b);
// sub.cpp
#include "sub.h"
int sub(int a, int b)
{
return a - b;
}
// quadrature.h 隐式调用
#include <iostream>
int quadrature(const int& a, const int& b);
// quadrature.cpp
#include "quadrature.h"
int quadrature(const int& a, const int& b)
{
return a - b;
}
编译源文件为位置无关的目标文件:
对于C++:
g++ -c -fPIC example.cpp -o example.o
-fPIC 参数用于生成位置无关的代码,这是创建动态库所必需的。
创建动态库:
g++ -shared -o libexample.so example.o
这会将目标文件 example.o 创建成一个名为 libexample.so 的动态库。
使用动态库:
隐式调用
// main.cpp
#include <iostream>
#include <dlfcn.h>
#include <stdlib.h>
#include "quadrature.h"
int main()
{
std::cout << quadrature(1, 2) << std::endl;
return 0;
}
编译源文件并链接动态库:
对于C++:
g++ main.cpp -o main -L./ -lquadrature
其中,-L 用于指定库文件的路径,-l 用于指定要链接的库(注意不需要写lib前缀和.so后缀)。
配置
第一种:隐式调用动态库需要把动态库拷贝到系统默认的库路径中,所以可以手动拷贝
第二种:
设置 LD_LIBRARY_PATH:** 如果库文件不在系统标准的库路径下,你可以使用 LD_LIBRARY_PATH 环境变量将其所在目录添加
到库搜索路径中。例如:
export LD_LIBRARY_PATH=/usr/vscode/动态库和静态库/隐式调用动态库/libquadrature.so:$LD_LIBRARY_PATH
但是这样有一个弊端,就是重新打开一个终端,就得再配置一遍环境变量
运行程序:
./main
这样就完成了在Linux下创建和使用动态库的过程。确保在编译时包含了正确的头文件路径和库文件路径,并且链接了所需的动态库。需要注意的是,在运行时,系统需要能够找到动态库,可以通过将动态库路径加入到LD_LIBRARY_PATH环境变量中,或者将动态库拷贝到系统默认的库路径中。
显式调用
// main.cpp
#include <iostream>
#include <dlfcn.h>
#include <stdlib.h>
#include "sub.h"
typedef int (*dfunc)(int, int);
int main()
{
void* dlib = dlopen("./libsub.so", RTLD_LAZY);
if (!dlib)
{
std::cout << "动态库打开失败" << std::endl;
return -1;
}
dfunc sub = (dfunc)dlsym(dlib, "sub");
if (!sub)
{
std::cout << "动态库加载失败" << std::endl;
dlclose(dlib);
return -1;
}
std::cout << sub(1, 2) << std::endl;
dlclose(dlib);
return 0;
}
编译源文件并链接动态库:
对于C++:
g++ main.cpp -o main -ldl
显式调用动态库不需要链接动态库路径和名称,但是因为调用了dlopen、dlsym、dlclose函数,需要链接libdl.so库
配置
不需要配置
运行程序:
./main
在Linux系统下创建静态库(Static Library)并使用,你可以按照以下步骤进行:
创建静态库:
编写源文件: 创建你的C/C++源文件(例如,example.c或example.cpp),并编写相应的代码。
/
/ sum.h
#include <iostream>
int sum(const int& a, const int& b);
// sum.cpp
#include "sum.h"
int sum(const int& a, const int& b)
{
return a + b;
}
编译源文件: 使用编译器将源文件编译成目标文件(.o文件):
对于C++:
g++ -c sum.cpp -o sum.o
打包目标文件为静态库:
ar rcs libexample.a sum.o
这会将目标文件 example.o 打包成一个名为 libexample.a 的静态库。
使用静态库:
编写使用静态库的源文件: 创建另一个源文件,并编写使用静态库的代码。
// main.cpp
#include <iostream>
#include "sum.h"
int main()
{
std::cout << sum(1, 2) << std::endl;
return 0;
}
编译源文件并链接静态库:
对于C++:
g++ main.cpp -o main -L./ -lsum
其中,-L 用于指定库文件的路径,-l 用于指定要链接的库(注意不需要写lib前缀和.a后缀)。
运行程序:
./main
这样就完成了在Linux下创建和使用静态库的过程。确保在编译时包含了正确的头文件路径和库文件路径,并且链接了所需的静态库。