创建动态库:
编写源文件:
// 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下创建和使用静态库的过程。确保在编译时包含了正确的头文件路径和库文件路径,并且链接了所需的静态库。