Linux生成静态库

GCC

什么是GCC

GCC 是 GNU 编译器集合(GNU Compiler Collection)的缩写。它是一个开源的编程语言编译器,支持多种编程语言,包括 C、C++、Objective-C、Fortran、Ada 和 Go 等。GCC 最初由理查德·斯托曼(Richard Stallman)创建,它是自由软件基金会(Free Software Foundation)的一部分,遵循 GNU 通用公共许可证(GNU General Public License)。

GCC编译流程

Linux生成静态库_第1张图片

GCC 常用命令

选项 说明
-E 只预处理指定源文件,不编译
-S 编译指定源文件,不汇编
-c 编译汇编指定源文件,不链接
-o [file1] [file2] 将文件 file2 编译成可执行文件 file1
-On n 得反胃是 [ 1 , 3 ] [1,3] [1,3] ,数字越大优化级别越高,编译时间越长,默认是 O1
-I directory 指定编译时头文件所在的目录
-l 指定编译时使用的库
-L 指定编译时使用库所在的路径
-g 编译时生成调试信息,表示该程序可以被调试器调试
-D 在编译时指定一个宏
-fpic 生成与位置无关的代码
-shared 生成共享目标文件,通常用在建立共享库的时候
-std 指定语言标准
-W 不生成任何警告
-Wall 生成所有警告

示例程序:

# 分步编译
gcc -E main.c -o main.i
gcc -S main.i -o main.s
gcc -c main.s -o main.o
gcc main.o -o main

# 一步到位
gcc main.c -o main

#多文件编译
gcc test.c main.c -o main

静态库

1.什么是库

  • 库文件是计算机上的一类文件,可以简单的把库文件看成是一种代码仓库,它提供给使用者一些直接可以拿来使用的变量、函数 和 类;

  • 库是一种特殊的程序,库的编写和一般的程序没区别,只是库不能独立运行

  • 库文件有两种,静态库 和 动态库(共享库),区别是:

    • 静态库在程序 链接阶段 被复制到了程序中;
    • 动态库在 链接阶段 没有被复制到程序中,而是在程序运行时由系统动态的加载到内存中供程序调用;

2.库的优点

  • 代码是保密的;
  • 方便部署和分发;

3.静态库的制作

命名规则

Linux:libxxx.a

  • lib :前缀(固定的);
  • xxx:库的名字(自己取名);
  • .a:后缀(固定的);

Windows:libxxx.lib

静态库制作
  1. gcc 编译,不链接,获得 .o 文件;
  2. .o 文件打包,使用 ar 工具(archive) ar rcs libxxx.a xxx.o xxx.o ...
  • r ,将文件插入到备存文件当中去;
  • c ,建立备存文件;
  • s,建立索引;

4.示例

在 Linux 中创建如下的一个 demo 的目录结构:

Linux生成静态库_第2张图片

从上到下依次的代码为:

head.h

#include 

int add(int a,int b);

int sub(int a,int b);

int mul(int a,int b);

double div(int a,int b);

main.c

#include 

#include "head.h"

int main(){
    int a = 10 , b = 20;
    printf("a = %d , b = %d\n",a,b);
    printf("a + b = %d\n",add(a,b));
    printf("a - b = %d\n",sub(a,b));
    printf("a * b = %d\n",mul(a,b));
    printf("a / b = %.2lf\n",div(a,b));

    return 0;
}

add.c

#include "head.h"

int add(int a,int b){
    return a + b;
}

sub.c

#include "head.h"

int sub(int a,int b){
    return a - b;
}

mul.c

#include "head.h"

int mul(int a,int b){
    return a * b;
}

div.c

#include "head.h"

double div(int a,int b){
    return a * 1.0 / b;
}
1.首先制作静态库 libcal.a
  1. 来到 src 目录下,首先要获得 .o 文件:

Linux生成静态库_第3张图片

这里报错了,显示找不到 head.h 头文件。

因为 head.h 头文件是在 include 目录下,从当前所在目录程序是无法找到的,我们只需要指定头文件的所在路径即可。

Linux生成静态库_第4张图片

  1. .o 文件打包,生成库文件 libcal.a

Linux生成静态库_第5张图片

2.生成可执行程序 app
  1. src 目录下生成的静态库移动到 lib 目录下:

Linux生成静态库_第6张图片
2. 生成可执行文件 app

Linux生成静态库_第7张图片

  • -I ./include/ 表示指定库文件的路径为 当前目录下的 include 目录下;
  • -L ./lib/ 指定库文件所在的路径;
  • -l cal 表示使用的是 名为cal 库文件;
3.执行

Linux生成静态库_第8张图片

你可能感兴趣的:(Linux,linux)