C语言 百分网手机站

C语言链接库的用法简记

时间:2020-09-05 15:41:37 C语言 我要投稿

C语言链接库的用法简记

  库文件简单了说就是包含了别人(或者自己)已经写好的代码,可以直接调用的其内部函数的文件。库文件又包含动态库文件和静态库文件。那不妨看看C语言链接库的用法简记吧。以下仅供参考!

  静态库

  Linux系统下后缀名为*.a

  Windows系统下后缀名为*.lib

  调用静态库,在编译器进行编译过程中,在有需要调用到库文件内部函数的地方,编译器会将静态库里的函数实现过程,拷贝到函数调用的地方。在编译好的程序运行时,不需要依赖库文件,可以独立运行。库文件对代码复用性很高,容易理解也容易使用,对提高开发速率有很大帮助,不需要自己造轮子。

  Linux下生成静态库文件命令

  $ gcc -c [FileName].c // 生成*.o文件

  $ ar -crv [FileName].a [FileName].o // 生成*.a文件

  动态库

  Linux系统下文件名格式为lib*.so

  Windows系统下后缀名*.dll

  上面介绍了静态库在编译过程中,编译器会将函数实现拷贝到可执行文件中,所以在程序运行时会占用一定的资源,造成资源浪费,而且在库文件的版本更新中,一点微小的改动,就需要对整个程序进行重新编译发布,在使用者使用过程中,这是得不偿失的'。而动态库,则改进了静态库的这些缺点。简单介绍两个方面:

  1、静态库在编译过程中不需要将代码编译到可执行程序中,在程序运行时需要调用的时候才加载。解决了在开发程序中使用静态库版本更新的问题,使用动态库不需要将自己编写的程序重新编译,更新库和更新程序是独立的两项任务。

  2、可以实现库共享,不同程序的相同功能代码的实现可以只需要一份库文件提供调用,比如jpeg图像编码功能,很多程序都需要进行图像处理,简单的Logo头像的显示到复杂的平面设计,不同的软件可能使用的都是同一份库文件。

  虽然动态库相对静态库优化了很多缺点,但并不是说可以完全不需要静态库。在内部开发的时候,两个同事对同一个项目的不同子功能进行开发,这些功能具有相互联系,但是又不希望对外部人员提供引用,在程序发布时,打包编译所有的代码实现都编译到程序中。

  Linux下编译生成动态库文件

  $ gcc -fPIC -c [FileName].c

  $ gcc -shared -o lib[FileName].so [FileName].o

  也可以一条命令编译

  gcc -fPIC -shared [FileName].c -o lib[Name].so

  0x02 库的编程使用

  我主要使用简单的编程实例介绍动态库的使用,静态库的使用方法与之相同。

  我所举的例子中编写了3份文件

  1、libtest.c // 库函数实现,最终将此文件编译成库文件

  2、test.h // 测试头文件,文件内只有一个结构体变量

  3、main.c // 测试代码主函数的实现

  ps: test.h头文件中只提供了一个结构体,库文件并不提供新的变量类型引用,新的变量一定需要定义

  直接呈上代码

  test.h:

  /** test.h **/

  #ifndef TEST_H

  #define TEST_H

  typedef struct {

  int a;

  char b;

  }Test_t;

  #endif

  libtest.c:

  /** libtest.c **/

  #include

  #include

  #include "./test.h"

  int fun1(int a)

  {

  return a*2;

  }

  Test_t *fun2(Test_t a)

  {

  a.a++;

  a.b = 's';

  Test_t *b = malloc(sizeof(Test_t));

  *b = a;

  return b;

  }

  很简单的内容,两个函数,fun1()和fun2()

  先编译库文件 libtest.so

  $ gcc -fpic -shared libtest.c -o libtest.so

  main.c:

  /** main.c **/

  #include

  #include

  #include "./test.h"

  int main()

  {

  //struct TEST_T A;

  Test_t A;

  A.a = 10;

  A.b = 'w';

  printf("[init] Test.a = %d ", A.a);

  printf("[init] Test.b = %c ", A.b);

  printf(" ");

  printf("[call] fun1() = %d ", fun1(A.a));

  printf(" ");

  Test_t *B;

  B = (Test_t *)fun2(A); // 加强制转换

  printf("[call] fun2().a = %d ", B->a);

  printf("[call] fun2().b = %c ", B->b);

  printf(" ");

  free(B);

  }

  编译主程序

  $ gcc main.c -L./ -ltest -I./ -o main

  0x03 测试&结果

  wangsansan@ubuntu$ ./main

  [init] Test.a = 10 [init] Test.b = w

  [call] fun_test() = 20

  [call] fun2_test().a = 11

  [call] fun2_test().b = s

  wangsansan@ubunut$

【C语言链接库的用法简记】相关文章:

assert用法(C语言)11-24

C语言指针的用法10-05

c语言new的用法10-04

c语言strcmp的用法09-28

c语言if语句的用法09-27

c语言链表的用法09-24

C语言中assert用法10-03

C语言指针用法详解09-20

C语言中的assert用法10-07

c语言new的用法介绍10-06