C语言——静态库和动态库的创建和使用

使用库函数是源码的一种保护

库函数其实不是新鲜的东西,我们一直都在用,比如C库。我们执行pringf() 这个函数的时候,就是调用C库的函数.

下面记录静态库和动态库的生成和使用.

静态库:libxxx.a

动态库:libxxx.so

静态库: 在程序编译的时候,将库编译进可执行程序中, 运行的时候不需要外部函数库

动态库: 在程序运行的时候,将库加载到程序中,运行的时候需要外部函数库

函数库的目录有 /lib 和 /usr/lib 和 自定义

一. 静态库的生成和使用

下面通过一个简单的小栗子来介绍库函数怎么生成和使用.

1.库函数的源码 hello.c

javascript 复制代码
#include "stdio.h"

int hello(void){

    printf("hello lib");  
  return 0;
}

#include "stdio.h"

int hello(void){

    printf("hello lib");  
  return 0;
}

2. 库函数的头文件 hello.h

javascript 复制代码
#ifndef __HELLO_H
#define __HELLO_H

int hello(void);

#endif

库文件的头文件是库文件的目录,因为库文件是保护的,看不到里面的源码,所以把函数接口通过头文件来让人调用 .这样就实现了接口,也保护了源码

3.编译静态库函数

3.1 将 hello.c 编译成目标文件 生成  hello.o文件

javascript 复制代码
gcc -c hello.c

3.2 将.o文件打包成静态库 生成 libhello.a库文件

javascript 复制代码
ar -cr libhello.a hello.o

4 使用静态库,因为静态库是在编译的时候一起打包进程序的,所以如果编译的时候没有静态库文件,则无法编译

4.1 main.c 写一个main函数来调用库函数

javascript 复制代码
#include "hello.h"    //引入库函数的头文件,这样才能找到函数声明

int main{
  
  hello();        //调用库函数

}

正常编译的时候是没办法通过的. 因为编译器找不到 hello() 的实现代码. 如图:

所以在编译的时候要加入库引用

javascript 复制代码
gcc -c main -L. -lhello -o a.out  

-L<路径> 引用自定义库的路径,如果调用系统库就不用-L '.'表示当前文件夹

-lxxxx 这里libhello.a 只要写hello 就可以   //小写的L

4.2 直接可以执行,因为库函数已经被编译进去了

二.动态库的编译及使用

同样的hello.c 源码

1.生成.o文件

javascript 复制代码
gcc -c -fpic hello.c //如果这里没有加-fpic 下一步就会提示你重新用 -fpic编译
  1. 编译成动态库
javascript 复制代码
gcc -shared -fpic -o libhello.so hello.o

-shared 是生成动态库

-fpic 生成位置无关代码,默认加

3. 使用动态库 和静态库一样

javascript 复制代码
gcc main.c -L. -lhello -o a.out

4. 执行 用动态库编译的程序没办法直接执行

在读取共享库libhello.so的时候出错,没有找到该文件

因为动态库程序会默认在 /lib 或者 /usr/lib的路径下寻找, 所以

解决的办法有3个:

1. 将.so 文件拷贝到 /usr/lib/文件夹下面

2.添加PATH环境变量

javascript 复制代码
export LD_LIBRARY_PATH=<动态库所在的绝对路径>

3.修改配置脚本

将动态库所在的路径加到 /etc/ld.so.conf 文件里

javascriptvim 复制代码

添加后刷新

javascript/sbin/ldconfig 复制代码
相关推荐
七七&5566 小时前
2024年08月13日 Go生态洞察:Go 1.23 发布与全面深度解读
开发语言·网络·golang
java坤坤6 小时前
GoLand 项目从 0 到 1:第八天 ——GORM 命名策略陷阱与 Go 项目启动慢问题攻坚
开发语言·后端·golang
元清加油6 小时前
【Golang】:函数和包
服务器·开发语言·网络·后端·网络协议·golang
健康平安的活着7 小时前
java之 junit4单元测试Mockito的使用
java·开发语言·单元测试
No0d1es7 小时前
电子学会青少年软件编程(C/C++)5级等级考试真题试卷(2024年6月)
c语言·c++·算法·青少年编程·电子学会·五级
DjangoJason8 小时前
C++ 仿RabbitMQ实现消息队列项目
开发语言·c++·rabbitmq
m0_480502648 小时前
Rust 入门 KV存储HashMap (十七)
java·开发语言·rust
大阳1238 小时前
线程(基本概念和相关命令)
开发语言·数据结构·经验分享·算法·线程·学习经验
YA3339 小时前
java基础(九)sql基础及索引
java·开发语言·sql
奇树谦10 小时前
QT|windwos桌面端应用程序开发,当连接多个显示器的时候,如何获取屏幕编号?
开发语言·qt