Linux下lib详细说明(2)

三、lib调用:
静态库的调用比较简单,跟标准库函数调用一样

一个例子:main.c调用./lib目录下libfunc.a库,该库头文件在./inc目录下,编译:

gcc -o test main.c -I./inc -L./lib -lfunc

共享库的调用需要注意库文件放置位置,如果该库文件不在/lib、/usr/lib下,则需要设置LD_LIBRARY_PATH变量。一个例子:main.c调用./lib目录下libfunc.so库,该库头文件在./inc目录下,如果使用编译:

gcc -o test main.c -I./inc -L./lib -lfunc
./test # 运行错误:error while loading shared libraries: libfunc.so

这是因为动态链接时程序只是存放共享库的名称而不是绝对路径,所以运行时我们需要先设置该库所处位置:

export LD_LIBRARY_PATH=./lib
./test # 运行成功

动态装载共享库:在只有共享库而没有库的头文件,或者你想在运行时动态加载、卸载库时,linux的dl库函数:dlopen、dlclose、dlsym帮你办到,其相当于windows下LoadLibrary、FreeLibrary、GetProcAddress函数

函数原型:

void *dlopen(const char *filename, int flag);
void *dlsym(void *handle, char *symbol);
int dlclose(void *handle);

一个例子:main.c动态装载./lib目录下libfunc.so库,库中有一个函数void print_str(const char*);

/*加载库*/
void *handle = dlopen("libfunc.so", RTLD_LAZY);
/*获得函数的入口*/
void (*pt_str)(const char*);
pt_str = dlsym(handle, "print_str");
/*调用函数*/
pt_str("hello world.");
/*卸载库*/
dlclose(handle);

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wzwfzx.html