生成动态库和静态库的过程可以分为三个步骤:编写源代码、编译生成目标文件、生成动态库或静态库。
编写源代码
首先,我们要编写需要打包成库的源代码。这里,我们假设我们已经编写好了一个简单的C语言用例,其中包含一个函数:
/* test.c */
#include <stdio.h>
int test_func(int a, int b) {
printf("test_func!\n");
return a + b;
}
编译生成目标文件
接下来,我们需要编译源代码生成目标文件,同时指定编译方式为生成动态库或静态库。生成动态库的编译方式为-shared,生成静态库的编译方式为-static。下面是两个例子:
生成动态库
gcc -fPIC -shared -o libtest.so test.c
生成的动态库文件为libtest.so
。其中,-fPIC表示生成位置无关代码,-shared表示生成动态链接库。
生成静态库
gcc -c test.c
ar -rcs libtest.a test.o
分别使用gcc编译test.c文件,得到test.o文件,然后使用ar命令将test.o文件打包成静态库libtest.a,其中-r表示创建或替换库文件,-c表示新建库文件,-s表示生成符号表。
加载示例方法
加载动态库
加载动态库的方法有两种:一种是使用ldd命令查看当前环境所支持的动态链接库,一种是用dlopen()方法动态加载某一个指定的动态链接库。
使用ldd命令查看动态链接库
ldd ./a.out
这条命令展示了./a.out二进制可执行文件的动态链接库依赖关系。其中,./a.out是可执行文件的路径。
使用dlopen()方法动态加载某一个指定的动态链接库
/* test_dynamic.c */
#include <stdio.h>
#include <dlfcn.h>
int main() {
void* handle = dlopen("./libtest.so", RTLD_LAZY);
if (!handle) {
fprintf(stderr, "%s\n", dlerror());
return 1;
}
dlerror();
int (*test_func)(int, int);
*(void **)(&test_func) = dlsym(handle, "test_func");
char* error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
return 1;
}
int result = test_func(2, 3);
printf("%d\n", result);
dlclose(handle);
return 0;
}
上述代码通过dlopen()方法加载libtest.so库文件,并执行测试函数test_func。
加载静态库
加载静态库的方法是在编译的时候将静态库链接到可执行文件中,这样生成的可执行文件就包含了静态库的代码。下面是一个例子:
gcc -o test_static test.c -L. -ltest
这条命令将test.c文件编译成test_static可执行文件,并且将libtest.a静态库链接到可执行文件中。-L.表示在当前目录查找链接库,-ltest表示链接libtest.a静态库。
总结
通过以上的步骤,我们就可以生成动态库和静态库,并且学会了加载动态库和静态库的方法。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:linux生成(加载)动态库静态库和加载示例方法 - Python技术站