静态库*.a和动态库*.so生成及调用

来源:互联网 发布:最全短期网络理财投资 编辑:程序博客网 时间:2024/05/22 16:50
gcc编译器工具一般位于/usr/bin或者/usr/local/bin目录,但它会从其它位置运行各种编译器支持的应用程序,这个位置可能是
  /usr/lib/gcc-lib/目录,GNU C/C++编译器的各个工具和GNU专用头文件都保存在这里。
  头文件,一般位于/usr/include,包含头文件编译:gcc -I/指定路径/include hellworld.c
  库文件,一般位于/lib或者/usr/lib,编译额外目录的库文件:gcc -L/指定目录 -l库名  helloworld.c
     .a为静态库,.so为共享库(动态库)
     
  静态库的生成及调用:(1)首先编写一个.c文件add.c,内容如下:
 
int add(int x, int y)  {      return x+y;  }

  首先将其加-c选项编译为add.o文件:gcc -c add.c
  (2)写一个add的头文件add.h,包含add的外部声名,内容如下:
  int add(int, int);

  (3)写一个主函数,test.c,内容如下:
 
#include <stdio.h>  #include "add.h"  //这里是注意点,不要忘了包含相关函数的头文件。   int main(void)  {      int sum = add(3, 4);      printf("sum: %d\n", sum);      return 0;  }

  gcc -c test.c 生成test.o
  现在如果不用静态库其实已经可以用gcc -o app test.o add.o就可以生成可执行文件app了。
  (4)生成静态库

 

ar crv libadd.a add.o

  这样就生成了libadd.a静态库,*.a当然可以包含很多个*.o文件,这里方便演示只定了一个*.o文件。

  (5)

gcc -o app test.o libadd.a

(注意*.a文件不能放*.o前面,这样子编译,*.a不一定要遵循命名格式)

   或者

gcc -o app test.o -L. -ladd

(-L.表示除了搜索标准C语言库外还要搜索当前目录,  也可以指定 -L/root/其它目录, -ladd 表明加载libadd.a库)

 
   动态库的生成及调用:
   (1)首先编写一个.c文件add.c,内容如下:
 
int add(int x, int y)  {      return x+y;  }

     编译生成*.so动态库:gcc -fPIC -shared libadd.so add.c
  (2)写一个主函数,test.c,内容如下:
 
#include <stdio.h>  //#include "add.h"  //动态库不需要有.h文件   int main(void)  {      int sum = add(3, 4);      printf("sum: %d\n", sum);      return 0;  }

   gcc -o app test.c libadd.so 生成app可执行文件或gcc -o app test.c -L. -ladd也行(-L.表示除了搜索标准C语言库外还要搜索当前目录,
   也可以指定 -L/root/其它目录, -ladd 表明加载libadd.a库))。
   如果运行app出现无法找到*.so文件,请把*.so拷到/usr/lib目录下即可。
原创粉丝点击