依赖静态库,编译生成动态库

前端之家收集整理的这篇文章主要介绍了依赖静态库,编译生成动态库前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。


如需转载请注明出处!


直入主题,目标是依赖静态库,编译动态库,最终生成二进制文件

文件目录如下:



文件内容组织:

add.c

  1. #include "add.h"
  2.  
  3. int add(int a,int b) {
  4. int c = a + b;
  5. return c;
  6. }



add.h
  1. #ifndef __ADD__
  2. #define __ADD__
  3.  
  4. int add(int a,int b);
  5.  
  6. #endif



mymath.c
  1. #include "mymath.h"
  2. #include "add.h"
  3.  
  4. int func_add(int a,int b) {
  5. int c = 0;
  6. c = add(a,b);
  7.  
  8. return c;
  9. }


mymath.h

  1. #ifndef __MYMATH__
  2. #define __MYMATH__
  3.  
  4. int func_add(int a,int b);
  5.  
  6. #endif

main.c

  1. #include <stdio.h>
  2. #include "mymath.h"
  3.  
  4. int main(int argc,char* argv[]) {
  5. int a = 1;
  6. int b = 2;
  7. int c = 0;
  8.  
  9. c = func_add(a,b);
  10.  
  11. printf("result = %d\n",c);
  12.  
  13. return 0;
  14. }


接下来,我们执行编译链接步骤。



接着,我们按照传统编译生成动态库文件的编译链接方式依赖libadd.a生成libmymath.so,并通过nm查看生成结果:



可以看出来,并没有任何我们定义的函数信息。


我们给出解决方法:通过使用 -Wl,--whole-archive 和 -Wl,--no-whole-archive来将静态库发包成动态库:



可以看到,我们定义的func_add出现在符号表。


最后我们通过依赖libmymath.so编译生成可执行文件来测试结果:





参考引用:

http://stackoverflow.com/questions/7935421/linking-archives-a-into-shared-object-so

猜你在找的设计模式相关文章