1. 用c语言写动态库:/** libsthc.h* Declarations for function add*/#include "stdio.h"#include "stdlib.h"#include "stdarg.h"#ifdef __cplusplusextern "C"{#endifint add(int x, int y);#ifdef __cplusplus}#endif/** libsthc.c* Implementation of function add declared in libsthc.h* in c language*/#include "libsthc.h"int add(int x, int y){return x + y;}#makefilelibsthc.so:libsthc.ogcc -shared libsthc.o -lc -o libsthc.solibsthc.o:libsthc.c libsthc.hgcc -fPIC -c libsthc.c -o libsthc.oall:libsthc.soclean:rm -f *.o *.somake完成后,会生成一个动态库,即libsthc.so。
为了使其他程序也可以使用该动态库,需要将库文件libsthc.so拷贝到/usr/lib目录下(由于权限的问题,一般要以root的身分进行拷贝),为了使其他程序也可以使用该动态库,需要将头文件libsthc.h拷贝到/usr/include目录下(由于权限的问题,一般要以root的身分进行拷贝)。
1.1 用c语言静态方式调用动态库libsthc.so:/** ctest.c* Testing program for libsthc.so library* in c languange* by 玄机逸士*/#include "libsthc.h"int main(void){printf("%d\n", add(1, 2));return 0;}#makefile:ctest:ctest.ogcc ctest.o -lsthc -o ctestctest.o:ctest.cgcc -c ctest.c -o ctest.oall:ctestclean:rm -f *.o ctest1.2 用c语言动态方式调用动态库libsthc.so:/*cdltest.c*/#include "stdio.h"#include "stdlib.h"#include "dlfcn.h"int main(void){void *handle;int (*fcn)(int x, int y);const char *errmsg;/* open the library */handle = dlopen("libsthc.so", RTLD_NOW);if(handle == NULL){fprintf(stderr, "Failed to load libsthc.so: %s\n", dlerror()); return 1;}dlerror();//*(void **)(&fcn) = dlsym(handle, "add"); //ok fcn = dlsym(handle, "add"); //ok if((errmsg = dlerror()) != NULL){printf("%s\n", errmsg);return 1;}printf("%d\n", fcn(1, 5));dlclose(handle);return 0;}#makefile:cdltest:cdltest.ogcc cdltest.o -ldl -lsthc -o cdltestcdltest.o:cdltest.cgcc -c cdltest.c -o cdltest.oall:cdltestclean:rm -f *.o cdltest1.3 用c++静态方式调用动态库libsthc.so:/**/#include "libsthc.h"using namespace std;int main(void){printf("%d\n", add(1, 2));return 0;}#makefile:cpptest:cpptest.og++ cpptest.o –o cpptest -lsthccpptest.o:g++ -c -Wno-deprecated -o cpptest.o all:cpptestclean:rm -f *.o cpptest1.4 用c++动态方式调用动态库libsthc.so:/*cppdltest.cpp*/#include "stdio.h"#include "stdlib.h"#include "dlfcn.h"int main(void){void *handle;int (*fcn)(int x, int y);const char *errmsg;/* open the library */handle = dlopen("libsthc.so", RTLD_NOW);if(handle == NULL){fprintf(stderr, "Failed to load libsthc.so: %s\n", dlerror()); return 1;}dlerror();*(void **)(&fcn) = dlsym(handle, "add"); //ok//fcn = dlsym(handle, "add"); //not ok in c++if((errmsg = dlerror()) != NULL){printf("%s\n", errmsg);return 1;}printf("%d\n", fcn(1, 5));dlclose(handle);return 0;}#makefilecppdltest:cppdltest.og++ cppdltest.o -ldl -lsthc -o cppdltestcppdltest.o:cppdltest.cppg++ -c cppdltest.cpp -o cppdltest.oall:cppdltestclean:rm -f *.o cppdltest2. 用c++语言写动态库:/** libsthcpp.h* Declarations for function cppadd*/#include "stdio.h"#include "stdlib.h"#include "stdarg.h"#ifdef __cplusplusextern "C"{#endifint cppadd(int x, int y);#ifdef __cplusplus}#endif/** libsthcpp.cpp* Implementation of function cppadd declared in libsthcpp.h* in c++ language*/#include "libsthcpp.h"int cppadd(int x, int y){return x + y;}#makefilelibsthcpp.so:libsthcpp.og++ -g -shared -Wl libsthcpp.o -lc -o libsthcpp.solibsthcpp.o: libsthcpp.hg++ -g -fPIC -c -o libsthcpp.oall:libsthcpp.soclean:rm -f *.o *.somake完成后,会生成一个动态库,即libsthcpp.so。