[轉]Linux操作系統下動態庫的編寫與調用

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.o gcc -shared libsthc.o -lc -o libsthc.solibsthc.o:libsthc.c libsthc.h gcc -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.o gcc ctest.o -lsthc -o ctestctest.o:ctest.c gcc -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.o gcc cdltest.o -ldl -lsthc -o cdltestcdltest.o:cdltest.c gcc -c cdltest.c -o cdltest.oall:cdltestclean: rm -f *.o cdltest1.3 用 c++ 靜態方式調用動態庫 libsthc.so :/*cpptest.cc*/#include "libsthc.h"using namespace std;int main(void){ printf("%d/n", add(1, 2)); return 0;}#makefile:cpptest:cpptest.o g++ cpptest.o –o cpptest -lsthccpptest.o:cpptest.cc g++ -c cpptest.cc -Wno-deprecated -o cpptest.oall: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.o g++ cppdltest.o -ldl -lsthc -o cppdltestcppdltest.o:cppdltest.cpp g++ -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.o g++ -g -shared -Wl libsthcpp.o -lc -o libsthcpp.solibsthcpp.o:libsthcpp.cc libsthcpp.h g++ -g -fPIC -c libsthcpp.cc -o libsthcpp.oall:libsthcpp.soclean: rm -f *.o *.somake 完成後,會生成一個動態庫,即 libsthcpp.so 。為了使其他程序也可以使用該動態庫,需要將庫文件 libsthcpp.so 拷貝到 /usr/lib 目錄下 ( 由於許可權的問題,一般要以 root 的身分進行拷貝 ) ,為了使其他程序也可以使用該動態庫,需要將頭文件 libsthcpp.h 拷貝到 /usr/include 目錄下 ( 由於許可權的問題 , 一般要以 root 的身分進行拷貝 ) 。2.1 用 c 語言靜態方式調用動態庫 libsthcpp.so :/* * ctest.c * Testing program for libsthcpp.so library * in c languange * by 玄機逸士*/#include "libsthcpp.h"int main(void){ printf("%d/n", cppadd(1, 2)); return 0;}#makefilectest:ctest.o gcc ctest.o -lsthcpp -o ctestctest.o:ctest.c gcc -c ctest.c -o ctest.oall:ctestclean: rm -f *.o ctest2.2 用 c 語言動態方式調用動態庫 libsthcpp.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("libsthcpp.so", RTLD_NOW); if(handle == NULL) { fprintf(stderr, "Failed to load libsthc.so: %s/n", dlerror()); return 1; } dlerror(); //*(void **)(&fcn) = dlsym(handle, "cppadd"); //ok in c and c++ fcn = dlsym(handle, "cppadd"); //ok in c, but not in c++ if((errmsg = dlerror()) != NULL) { printf("%s/n", errmsg); return 1; } printf("%d/n", fcn(1, 5)); dlclose(handle); return 0;}#makefilecdltest:cdltest.o gcc cdltest.o -ldl -lsthcpp -o cdltestcdltest.o:cdltest.c gcc -c cdltest.c -o cdltest.oall:cdltestclean: rm -f *.o cdltest2.3 用 c++ 語言靜態方式調用動態庫 libsthcpp.so :/* * cpptest.cpp * Testing program for libsthc.so library written in c language * in c++ languange * by 玄機逸士*/#include "libsthcpp.h"#include "iostream.h"int main(void){ cout << cppadd(1, 2) << endl; return 0;}#makefilecpptest:cpptest.o g++ cpptest.o -lsthcpp -o cpptestcpptest.o:cpptest.cpp g++ -c cpptest.cpp -Wno-deprecated -o cpptest.oall:cpptestclean: rm -f *.o cpptest2.4 用 c++ 語言動態方式調用動態庫 libsthcpp.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("libsthcpp.so", RTLD_NOW); if(handle == NULL) { fprintf(stderr, "Failed to load libsthc.so: %s/n", dlerror()); return 1; } dlerror(); *(void **)(&fcn) = dlsym(handle, "cppadd"); //ok in c and c++ //fcn = dlsym(handle, "cppadd"); //ok in c, but not in c++ if((errmsg = dlerror()) != NULL) { printf("%s/n", errmsg); return 1; } printf("%d/n", fcn(1, 5)); dlclose(handle); return 0;}#makefilecppdltest:cppdltest.o g++ cppdltest.o -ldl -lsthcpp -o cppdltestcppdltest.o:cppdltest.cpp g++ -c cppdltest.cpp -o cppdltest.oall:cppdltestclean: rm -f *.o cppdltest轉自:http://blog.csdn.net/pathuang68/article/details/4273904
推薦閱讀:

詳解Linux許可權提升的攻擊與防護
Linux Kernel 4.0 中的 live patching 是如何實現的?
usb的端點是什麼?
為什麼很多人說在Linux環境下開發優於Windows?
Linux不是開源的嗎,為什麼RedHat的伺服器版那麼貴?

TAG:操作系統 | Linux | 系統 | 動態 | 動態庫 |