歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Linux C++動態鏈接庫so編寫

Linux下的動態鏈接庫是.so文件,即:Shared Object,下面是一個簡單的例子說明如何寫.so以及程序如何動態載入.so中的函數和對象。

  1. //testso.h:   
  2. #ifndef _TESTSO_H   
  3. #define _TESTSO_H   
  4. extern "C"   
  5. {  
  6.     int myadd(int a, int b);  
  7.     typedef int myadd_t(intint); // myadd function type   
  8. }  
  9. #endif // _TESTSO_H   
  10.   
  11.   
  12. //testso.cpp:   
  13. #include "testso.h"   
  14.   
  15. extern "C"  
  16. int myadd(int a, int  b)  
  17. {  
  18.     return a + b;  
  19. }  

編譯so:
g++  -shared  -fPIC  -o testso.so testso.cpp
注意,-shared參數和-fPIC參數非常重要:
-shared 告訴gcc要生成的是動態鏈接庫;
-fPIC 告訴gcc生成的生成的代碼是非位置依賴的,方面的用於動態鏈接。

在主程序裡調用這個動態鏈接庫:

  1. //main.cpp:   
  2. #include <stdio.h>   
  3. #include <dlfcn.h>   
  4. // for dynamic library函數   
  5. #include "testso.h"   
  6.   
  7. void print_usage(void)  
  8. {  
  9.     printf("Usage: main SO_PATH/n");  
  10. }  
  11.   
  12. int main(int argc, char *argv[])  
  13. {  
  14.     if (2 != argc) {  
  15.         print_usage();  
  16.         exit(0);  
  17.     }  
  18.   
  19.     const char *soname = argv[1];  
  20.   
  21.     void *so_handle = dlopen(soname, RTLD_LAZY); // 載入.so文件   
  22.     if (!so_handle) {  
  23.         fprintf(stderr, "Error: load so `%s' failed./n", soname);  
  24.         exit(-1);  
  25.     }  
  26.   
  27.     dlerror(); // 清空錯誤信息   
  28.     myadd_t *fn = (myadd_t*)dlsym(so_handle, "myadd"); // 載入函數   
  29.     char *err = dlerror();  
  30.     if (NULL != err) {  
  31.         fprintf(stderr, "%s/n", err);  
  32.         exit(-1);  
  33.     }  
  34.   
  35.     printf("myadd 57 + 3 = %d/n", fn(57, 3)); // 調用函數   
  36.   
  37.     dlclose(so_handle); // 關閉so句柄   
  38.     return 0;  
  39. }  
Copyright © Linux教程網 All Rights Reserved