静态库

1.库的概念

  • 库是一个二进制文件,包含的代码可被程序调用
  • 例如标准C库,数学库,线程库...
  • 库有源码,可下载后编译;也可以直接安装二进制包
  • 路径:/lib /usr/lib

2.库的知识

  • 库是事先编译好的,可以复用的代码
  • 在操作系统上运行的程序都需要使用库,使用库可提升开发效率
  • win和linux下库文件格式不兼容
  • linux下包含静态库和共享库

3.静态库特点

gcc编译过程

  • 编译(链接)时候把静态库中相关代码复制到可执行文件中
    好处:
    1.程序中已经包含代码,在运行时候不需要静态库
    2.程序运行时无需加载库,运行速度更快
    缺点:
    1.带来的后果是程序占用更多磁盘空间和内存空间
    2.静态库升级后,程序需要重新编译链接

4.静态库的创建

  • 步骤:
    1.确定库中函数的功能,接口
    2.编写源码hello.c
#include 

void hello(void)
{
  printf("hello world\n");
  return;
}

3.编译生成目标文件.o
gcc -c hello.c -Wall
4.创建静态库
ar crs libhello.a hello.o
注意:
linux下静态库必须以lib开始,.a结束,即lib*.a
5.查看库中符号信息
nm libhello.a
全过程如下:

hanqi@hanqi-PC:~/C/IO$ gcc -c hello.c -Wall
hanqi@hanqi-PC:~/C/IO$ ar crs libhello.a hello.o
hanqi@hanqi-PC:~/C/IO$ nm libhello.a

hello.o:
                 U _GLOBAL_OFFSET_TABLE_
0000000000000000 T hello
                 U puts

6.最终提供给他人使用的就是.a,h文件,进而保护了源码(.c文件)
7.查看库大小du libhello.a

5.链接静态库

  • 步骤:
    1.编写测试程序test.c
#include 

void hello(void);
int main(void)
{
  hello();
  return;
}

2.编译test.c并链接静态库libhello.a
gcc -o test test.c -L. -lhello

  • 其中在-L后可指定库的路径,.代表当前目录
  • -l之后不是直接写库文件名libhello.a,而需要将其去头(lib)去尾(.a),得到hello
  • gcc默认先链接共享库,再链接静态库

3.gcc会优先在/usr/lib/下寻找库文件,如果想让其在指定目录下寻找,指令如下gcc test.c -o test -L./ -lhello

你可能感兴趣的:(静态库)