歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Linux C++動態鏈接庫so編寫

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

日期:2017/3/1 10:10:02   编辑:Linux編程

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(int, int); // myadd function type
  8. }
  9. #endif // _TESTSO_H
  10. //testso.cpp:
  11. #include "testso.h"
  12. extern "C"
  13. int myadd(int a, int b)
  14. {
  15. return a + b;
  16. }

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