Unix/Linux C动态库的使用
动态库的生成:
gcc -O -fpic -shared -o share.so share.c
有的gcc版本可以用"-G"替换"-shared"选项.
eg.使用动态库
#cc -O test.c ./share.so
eg.带路径编译
#cc -O test.c ./lib/share.so
当执行./a.out时,操作系统会自动在当前目录lib下查找share.so,若找不到程序将被杀.
当然也可以通过更改环境变量:
#LD_LIBRARY_PATH=./:share
#export LD_LIBRARY_PATH
#./a.out
例程:
dll1.c
#include <stdio.h>
int p = 1;
void print() { printf("This is the first dll lib provided function: print().\n");
return; }
|
dll2.c
#include <stdio.h>
int p = 2;
void print() { printf("This is the second dll lib provided function: print().\n");
return; }
|
implicit_test.c
int main (int argc, char *argv[]) { print();
return 0; }
|
explicit_test.c
#include <stdio.h> #include <stdlib.h> #include <dlfcn.h>
int main(int argc, char *argv[]) { void *handle; /* pointer of dll lib handle */ void (*pfunc)(); int *p;
handle = dlopen("./dll1.so", RTLD_NOW); /* RTLD_LAZY mode, parsed symbol when called */ p = (int *)dlsym(handle, "p"); if (p != NULL) { printf("p = %d.\n", *p); }
if ( dlsym(handle, "pp") == NULL ) /* none exist variable pp */ { printf( "%s\n", dlerror() ); /* print error, and clean */ }
pfunc = (void (*)())dlsym(handle, "print"); if (pfunc != NULL) { pfunc(); }
dlclose(handle);
return 0; }
|
Makefile
LIB= -ldl
dll: gcc -O -fpic -shared -o dll1.so dll1.c gcc -O -fpic -shared -o dll2.so dll2.c # some version of gcc supports "-G" instead of "-shared" option
implicit_test: gcc -O -o implicit_test implicit_test.c ./dll1.so # argument: ./dll1.so, explicitly tell the os to search dll location. # if not told path, when running, os will implicitly search at default # +LD_LIBRARY_PATH=./:dll/
explicit_test: gcc -O -o explicit_test $(LIB) explicit_test.c
clean: rm -f dll1.so dll2.so implicit_test explicit_test
|