IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Linux库的制作和使用 -> 正文阅读

[系统运维]Linux库的制作和使用

编译一个程序为可执行文件时,需要经过四部曲 : 预处理、编译、汇编、链接
在这里插入图片描述

而库是二进制形式目标模块的包,是多个目标模块(xxx.o)的集合

当使用库时,在链接阶段可以将库链接进可执行程序,同时也可以链接目标模块

库的概念

库是一个二进制文件,包含的代码可被程序调用(标准C库、数学库、线程库…)
库有源码,可下载后编译;也可以直接安装二进制包
系统中一般默认库的安装路径:/lib 、 /usr/lib

库是事先编译好的,可以复用的代码。
在OS上运行的程序基本上都要使用库,使用库可以提高开发效率。
Windows和Linux下库文件的格式不兼容
Linux下包含静态库和共享库(动态库)

静态库(*.a)

特点

  • 链接阶段被加载到目标文件中
  • 程序运行时不需要加载静态库,运行速度快
  • 编译后的可执行程序体积较大
  • 静态库升级后,程序需要重新编译链接

制作

  • 确定库中函数的功能接口

  • 编译库源码hello.c

#include <stdio.h>
void hello(void){
   printf("hello world\n");
   return ;
}
  • 编译生成目标文件
    gcc -c hello.c -Wall

  • 将目标文件打包成静态库(库名的前缀必须是lib)
    ar crs libhello.a hello.o

使用

  • 编写应用程序test.c
#include <stdio.h>

void hello(void);
int main(){
	hello();
	return 0;
}
  • 编译test.c 并链接静态库libhello.a
    gcc -o test test.c -L. -lhello
    注:-l表示链接哪个库名-L表示库的额外搜索路径(相对路径或者绝对路径),例如在当前目录下时用“-L.”表示,在当前目录下的lib文件夹中用“-L./lib”

在这里插入图片描述

共享(动态)库(*.so)

特点

编译(链接)时仅记录用到哪个共享库中的哪个符号,不复制共享库中相关代码

  • 程序不包含库中代码,尺寸小
  • 多个程序可共享同一个库
  • 程序运行时需要加载库
  • 升级方便无需要重新编译程序

制作

  • 确定库中函数的功能接口

  • 编译库源码hello.c bye.c

#include <stdio.h>
void hello(void)
{
	printf("hello world\n");
	return ;
}
#include <stdio.h>
void bye(void)
{
	printf("bye!\n");
	return ;
}
  • 编译生成目标文件
    gcc -c -fPIC hello.c bye.c -Wall(-fPIC:必须编译选项,表示生成位置无关代码 概念上就是在可执行程序装载它们的时候,它们可以放在可执行程序的内存里的任何地方。 )

  • 创建共享库 common
    gcc -shared -o libcommon.so.1 hello.o bye.o

  • 为共享库文件创建链接文件
    ln -s libcommon.so.1 libcommon.so

  • 符号链接文件命名规则
    lib<库名>.so

使用

  • 编写应用程序test.c
#include <stdio.h>
#include "common.h"

int main(){
	hello();
	bye();
	return 0;
}
  • 编译test.c 并链接共享库libcommon.so
    gcc -o test test.c -L. -lcommon
    注:-l表示链接哪个库名-L表示库的额外搜索路径(相对路径或者绝对路径),例如在当前目录下时用“-L.”表示,在当前目录下的lib文件夹中用“-L./lib”

注意??:当静态库和动态库同名,优先使用动态库
使用动态库时,分两种加载方法,分别是静态加载和动态加载
静态加载就是程序一运行, 就自动加载
动态加载就是程序运行中,由程序猿的代码控制加载

此时还不能立即,因为在动态函数库使用时,会查找/usr/lib /lib目录下的动态函数库,而此时我们生成的库不在里边,我们要加载共享库。

加载共享库

添加共享库的加载路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
在这里插入图片描述

如何找到共享库

运行时要让执行程序顺利找到动态库,有三种方法 :

  1. 把库拷贝到/usr/lib和/lib目录下(不建议)

  2. 在LD_LIBRARY_PATH环境变量中加上库所在路径。 //对当前的shell,临时生效
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

  3. 修改/etc/ld.so.conf文件,把库所在的路径加到文件末尾,并执行sudo ldconfig刷新。

    /etc/ld.so.conf是非常重要的一个目录,里面存放的是链接器和加载器搜索共享库时要检查的目录,默认是从/usr/lib /lib中读取的,所以想要顺利运行,我们也可以把我们库的目录加入到这个文件中并执行/sbin/ldconfig。

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-04-24 09:50:00  更:2022-04-24 09:53:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 19:58:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码