1.静态库与动态库

静态库:
1.用户自己写的外部调用库文件;
2.静态库代码编译完成,通过链接文件直接嵌入可执行文件中;
3.静态库更新后需要重新编译库文件再链接;

动态库:
1.便于更新;
2.执行文件体积小;
3.多个执行文件可以指向同一个动态库;

2.静态库

创建静态库:相当于自己写一个库文件用于函数的调用;

此处写出 add.c 和 add.h 文件,用于执行文件main的调用,库文件与执行文件默认在同一文件夹下;

步骤1:编写静态库代码 add.c add.h

add.c

#include <stdio.h>
#include "add.h"

void add(void)
{
    printf("33333333333\n");
    return;
}

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

add.h

#ifndef __ADD_H
#define __ADD_H

#include <stdio.h>

void add(void);
// int my_add(void);
void hello(void);
#endif //__MY_HELLO_H

步骤2:生成静态库可执行文件add.o

gcc -c add.c

或者

gcc -c add.c -o add.o

步骤3:根据add.o生成静态库文件 libadd.a

ar crs libadd.a add.o

或者

ar -cr libadd.a add.o

步骤4:libadd.a 嵌入到main可执行文件中

gcc main.c -ladd -L. -o mian

或者

gcc main.c -L./path_to_lib -lmylib -o main(输入lib文件路径)

注意,为避免文件编译时错误,即使调用add.h头文件,最好在可执行文件代码中main函数前加入引用声明:

#include <stdio.h>
#include "add.h"


void add(void);
void hello(void);

int main(int argc, const char *argv[])
{
    // my_hello("zhangsan");
    add();
    hello();
    return 0;
}

3.动态库

步骤1:编写动态库代码 addf.c addf.h

addf.c

#include <stdio.h>
#include "addf.h"

void addf(void)
{
    return 1+5;
}

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

步骤2:生成与位置无关的目标文件

gcc -c -fPIC addf.c

或者

gcc -c -fPIC addf.c -o addf.o

步骤3:根据addf.o生成动态库文件 libaddf.so

gcc -shared addf.o -o libadd.so

步骤4:libadd.so 链接到可执行文件中

gcc main.c -laddf -L. -o my_addf

步骤5:符号链接的几种方法

  1. export LD_LIBRARY_PATH=$PWD (PWD表示当前路径)
  2. 转存库路径:
    系统级库路径: /usr/lib
    个人库路径:/usr/local/lib
    使用mv 命令转存,而后执行更新缓存命令 ldconfig

在这里插入图片描述

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐