C++动态链接库实践

朱雀 2023-08-17 16:30 207阅读 0赞

参考:https://www.cnblogs.com/Anker/p/3746802.html

gcc -fPIC -shared calc.c -o libcalc.so, 编译得到

1444224-20190831082928754-372069685.png

在linux上 man dlopen可以得到以下信息:

1444224-20190831083216659-2034812336.png

头文件注释:

1444224-20190831091010137-1506806703.png

实践内容:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <dlfcn.h>
  4. //动态链接库路径
  5. #define LIB_CACULATE_PATH "/home/dahui/work/workspace/CStudy/src/libcalc.so"
  6. //函数指针
  7. typedef int (*CAC_FUNC)(int, int);
  8. int main(void) {
  9. printf("!!!Hello World!!!\n"); /* prints !!!Hello World!!! */
  10. void *handle;
  11. char *error;
  12. CAC_FUNC cac_func = NULL;
  13. //打开动态链接库
  14. handle = dlopen(LIB_CACULATE_PATH, RTLD_LAZY);
  15. if (!handle) {
  16. fprintf(stderr, "%s\n", dlerror());
  17. exit(EXIT_FAILURE);
  18. }
  19. //清除之前存在的错误
  20. dlerror();
  21. //获取一个函数
  22. *(void **) (&cac_func) = dlsym(handle, "add");
  23. //cac_func = (CAC_FUNC) dlsym(handle, "add");
  24. if ((error = dlerror()) != NULL) {
  25. fprintf(stderr, "%s\n", error);
  26. exit(EXIT_FAILURE);
  27. }
  28. printf("add: %d\n", (*cac_func)(2, 7));
  29. cac_func = (CAC_FUNC) dlsym(handle, "sub");
  30. printf("sub: %d\n", cac_func(9, 2));
  31. cac_func = (CAC_FUNC) dlsym(handle, "mul");
  32. printf("mul: %d\n", cac_func(3, 2));
  33. cac_func = (CAC_FUNC) dlsym(handle, "div");
  34. printf("div: %d\n", cac_func(8, 2));
  35. printf("!!!Hello World!!!"); /* prints !!!Hello World!!! */
  36. //关闭动态链接库
  37. dlclose(handle);
  38. //exit(EXIT_SUCCESS);
  39. printf("!!!Hello World!!!"); /* prints !!!Hello World!!! */
  40. return EXIT_SUCCESS;
  41. }

输出:

1444224-20190902075329298-284771609.png

转载于:https://www.cnblogs.com/do-your-best/p/11437836.html

发表评论

表情:
评论列表 (有 0 条评论,207人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C++引用动态

    因为要使用到C++的动态链接库,所以就特意网上找了一下资料实现了一下。 文章目录 一、lib与dll文件 二、创建dll文件 三、dll隐式链接

    相关 动态

    动态链接库的建立 头文件 stdafx.h // stdafx.h: 标准系统包含文件的包含文件, // 或是经常使用但不常更改的 /

    相关 动态VS静态

    静态链接库在所开发的程序中通过程序接口来调用库函数,这些库函数只有在连接时才会真正连接到应用程序中。静态链接库的缺陷:假设两个应用程序同时运行,并且使用了相同的静态链接库,那么