Linux | 动静态库与Makefile

高质量编程概述

在产品开发当中,我们常常需要编写许多代码,而这些代码不可以只通过一个文件来管理,必然是会分散在一个工程的多个文件中,并且这样子的一个工程代码也会是通过多个人来维护及开发,这时就会碰到一些问题,比如

  1. 我写的代码如何在提供给别个调用的同时尽可能的保护起来呢
  2. 一个工程包含有那么多的文件,我们该如何去快速编译出来呢

这时,就需要用到动静态库及Makefile内容。
下面将会详细给大家介这两个方面的内容

1. linux动静态库

库=功能库=接口库=函数库=平台库
将功能代码封装(制作)成一个代码块,以便供用户在后面二次开发时使用(调用)

  1. 保护代码
  2. 缩短开发周期

函数库:某些功能代码的封装( 只能调用接口来实现库中的功能,但是不能看到里面源码实现过程)
linux以 .a 结尾的是静态库,有 .so 为动态库; linux的默认库位置 /lib
静态:
动态:

命名:
libxxx.a/so
lib:说明是一个库
xxx:代表功能
.a:静态
.so:动态

三种标准库链接方式的选项及区别

连接方式 示例选项 优点 缺点
全静态 -static -pthread -Irt -Idl 不会 发生应用程序在不同Linux 版本下的标准库不兼容问题。即这个库跟平台没有关系 生成的文件比较大, 应用程序功能受限(不能调用动态库等)
全动态 -pthread -Irt -ldl 生成文件是三者中最小的 比较容易发生应用程序在不同Linux版本下标准库依赖不兼容问题
半静态 -read -lrt -ldl 灵活度大,能够针对不同的标准库采取不同的链接策略,从而避免不兼容问题发生。结合了全静态与全动态两种链接方式的优点 比较难识别哪些库容易发生不兼容问题,目前只有依靠经验积累。某些功能会因选择的标准库版本而丧失。

1.1 静态库创建与使用

静态库创建

  1. 将.c编译成.o文件
    gcc -c file1.c file2.c .
  2. 利用ar工具将.o文件链接成.a(静态库文件)
    ar -crv libXXX.a file1.o file2.o

说明:
XXX是库名,file1.o file2.o是要打包的目标文件。crv参数,含义分别是
c: do not warn if the library had to be created
r: replace existing or insert new file(s) into the archive
v: be verbose

静态库使用

使用时,只需在代码中引入头文件,链接时,指定静态库的搜索路径(-L 选项)和静态库名(不需要 lib 前缀和 .a 后缀, -l 选项)。
gcc main.c -0 main libXX.a(加上静态库)

或者:
gcc main.c- -Llibdir- 1XXX

libdir:代表依赖库所在的目录
xxx:代表去掉lib的库名

或者将静态库拷贝至系统的共享库目录(后面专门介绍)

示例:
1)编辑代码

#vim add.c
添加如下内容:

#include "add.h"
int add func(int x, int y)
return x+Y;
}

#vim add.h
添加如下内容:

#ifndef_ ADD_ FUNC H
#define__ DD_ FUNC_ H
int add_ func(int x,int y);
#endif

#vim sub.c
添加如下内容:

#include "sub.h"
int sub_ func(int x, int y)
return x-Y;
}

#vim sub.h
添加如下内容:

#ifndef
_SUB_ FUNC_ H
#define__ SUB_ FUNC_ H
int sub_ func(int x, int<

你可能感兴趣的:(Linux,嵌入式,linux,运维,编译器)