Linux下动态库的创建和加载
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/* main.c */ #include <stdio.h> int main( void ) {
int a = 30; int b = 22;
printf( "%d+%d=%d\n", a, b, add(a,b) ); printf( "%d-%d=%d\n", a, b, sub(a,b) );
动态库的创建和使用——动态加载
1、准备2个源程序 /* add.c */ int add(int a, int b) {
return a+b; }
/* sub.c */ int sub( int a, int b ) {
return a-b; }
2、创建共享库 gcc -c -fPIC sub.c gcc -c -fPIC add.c gcc -shared -fPIC -o libouyang.so sub.o add.o
3、动态加载动态库 所谓动态加载,就是程序自己在运行中,自己加载某个动态库。 使用 dlopen() 打开动态库,dlclose()关闭动态库 代码实现如下:
/* main.c */ #include <stdio.h> #include <stdlib.h> #include <dlfcn.h> /* dlopen() 等动态库使用函数在 dlfcn.h 中定义 */
return 0; }
动Hale Waihona Puke Baidu库的创建和使用——静态加载
Author: jxfengzi@yahoo.com.cn
1、准备3个源程序 /* add.c */ int add(int a, int b) {
return a+b; }
/* sub.c */ int sub( int a, int b ) {
return a-b; }
return 0; }
2、创建共享库 gcc -c -fPIC sub.c gcc -c -fPIC add.c gcc -shared -fPIC -o libouyang.so sub.o add.o
3、使用共享库: gcc -o main -L. -louyang main.c
4、执行./main 时会报告错误,提示无法加载 libouyang.so 共享库: ./main: error while loading shared libraries: libouyang.so: cannot open shared object file: No such file or directory
5、处理方法有三
方法一: 将动态库拷贝到/lib 或/usr/lib 中去 如:sudo cp libouyang.so /lib
方法二: 改变环境变量: LD_LIBRARY_PATH=$PWD export LD_LIBRARY_PATH
方法三: 在编译时指定共享库的路径: gcc -o main1 -Wl,-rpath,. -L. -louyang main.o
/* 查找符号表成功,可以正常使用动态库中的函数 */ printf( "%d+%d=%d\n", a, b, dl_add(a,b) ); printf( "%d-%d=%d\n", a, b, dl_sub(a,b) );
/* 关闭动态库 */ dlclose( handle_dll); handle_dll = NULL;
int main( void ) {
int a = 30; int b = 20;
/* 动态库句柄 */ void *handle_dll = NULL;
/* 函数指针 */ int ( *dl_add )( int , int ); int ( *dl_sub )( int , int );
/* 打开某个动态库,注意检查打开是否成功 */ handle_dll = dlopen( "libouyang.so", RTLD_LAZY ); if ( handle_dll == NULL ) {
printf( "libouyang.so not found! \n" ); exit(0); }
/* 查找符号表,完整的做法也应该检查符号表查找是否成功 */ dl_add = dlsym( handle_dll, "add"); dl_add = dlsym( handle_dll, "sub");
int a = 30; int b = 22;
printf( "%d+%d=%d\n", a, b, add(a,b) ); printf( "%d-%d=%d\n", a, b, sub(a,b) );
动态库的创建和使用——动态加载
1、准备2个源程序 /* add.c */ int add(int a, int b) {
return a+b; }
/* sub.c */ int sub( int a, int b ) {
return a-b; }
2、创建共享库 gcc -c -fPIC sub.c gcc -c -fPIC add.c gcc -shared -fPIC -o libouyang.so sub.o add.o
3、动态加载动态库 所谓动态加载,就是程序自己在运行中,自己加载某个动态库。 使用 dlopen() 打开动态库,dlclose()关闭动态库 代码实现如下:
/* main.c */ #include <stdio.h> #include <stdlib.h> #include <dlfcn.h> /* dlopen() 等动态库使用函数在 dlfcn.h 中定义 */
return 0; }
动Hale Waihona Puke Baidu库的创建和使用——静态加载
Author: jxfengzi@yahoo.com.cn
1、准备3个源程序 /* add.c */ int add(int a, int b) {
return a+b; }
/* sub.c */ int sub( int a, int b ) {
return a-b; }
return 0; }
2、创建共享库 gcc -c -fPIC sub.c gcc -c -fPIC add.c gcc -shared -fPIC -o libouyang.so sub.o add.o
3、使用共享库: gcc -o main -L. -louyang main.c
4、执行./main 时会报告错误,提示无法加载 libouyang.so 共享库: ./main: error while loading shared libraries: libouyang.so: cannot open shared object file: No such file or directory
5、处理方法有三
方法一: 将动态库拷贝到/lib 或/usr/lib 中去 如:sudo cp libouyang.so /lib
方法二: 改变环境变量: LD_LIBRARY_PATH=$PWD export LD_LIBRARY_PATH
方法三: 在编译时指定共享库的路径: gcc -o main1 -Wl,-rpath,. -L. -louyang main.o
/* 查找符号表成功,可以正常使用动态库中的函数 */ printf( "%d+%d=%d\n", a, b, dl_add(a,b) ); printf( "%d-%d=%d\n", a, b, dl_sub(a,b) );
/* 关闭动态库 */ dlclose( handle_dll); handle_dll = NULL;
int main( void ) {
int a = 30; int b = 20;
/* 动态库句柄 */ void *handle_dll = NULL;
/* 函数指针 */ int ( *dl_add )( int , int ); int ( *dl_sub )( int , int );
/* 打开某个动态库,注意检查打开是否成功 */ handle_dll = dlopen( "libouyang.so", RTLD_LAZY ); if ( handle_dll == NULL ) {
printf( "libouyang.so not found! \n" ); exit(0); }
/* 查找符号表,完整的做法也应该检查符号表查找是否成功 */ dl_add = dlsym( handle_dll, "add"); dl_add = dlsym( handle_dll, "sub");