首页 > 系统相关 >2.Linux编程-库

2.Linux编程-库

时间:2024-09-02 16:27:57浏览次数:6  
标签:文件 fun1 lib fun2 编程 so Linux main


命名(习惯 ):
静态库: .lib/.a 动态库.dll/.so
静态库的命名一般分为三个部分:
前缀:lib
库名称:自定义即可, 如test
后缀:.a

共享库的命名一般分为三个部分:
前缀:lib
库名称:自己定义即可, 如test
后缀:.so

库制作完成后, 如何给用户使用
头文件—包含了库函数的声明
库文件—包含了库函数的代码实现

静态库的制作:

1 将.c文件编译成.o文件
		gcc -c fun1.c fun2.c   
2 使用ar命令将.o文件打包成.a文件
		ar rcs libtest1.a fun1.o fun2.o  // 一定要加.a 后缀,否则识别不到
		r:更新 
		c:创建
		s:建立索引

静态库的使用:

-I 指定头文件
-L: 指定库文件所在目录
-l: 指定库文件 libtest1.a  对应的是 test1
1 main.c与head.h和libtest1.a在同一级目录的情况
	gcc -o main1 main.c -I./ -L./ -ltest1
2 main.c与head.h和libtest1.a在不同一级目录的情况
	gcc -o main1 main.c -I./include -L./lib -ltest1

动态库的制作:

1 将.c文件编译成.o文件
		gcc -fpic -c fun1.c fun2.c
2 使用gcc将.o文件编译成库文件
		gcc -shared fun1.o fun2.o -o libtest2.so

动态库的使用:

gcc -o main2 main.c -I./include -L./lib -ltest2

动态库文件在编译的时候, 连接器需要使用参数-L找到库文件所在的路径;
在执行的时候, 是加载器ldd根据动态库的路径进行加载的, 与编译的时候用的-L指定的路径无关.

最常用的解决办法:将LD_LIBRARY_PATH环境变量加到用户级别的配置文件~/.bashrc中,
然后生效(. ~/.bashrc source ~/.bashrc 退出终端然后再登录)

head.h

void fun1();
void fun2();

fun1.c

#include <stdio.h>
void fun1()
{
    printf("this is fun1\n");	
}

fun2.c

#include <stdio.h>
void fun2()
{
    printf("this is fun2\n");	
}

main.c

#include <stdio.h>
#include <stdlib.h>
#include "head.h"   // 头文件添加的时机是,谁调用谁加头文件,预处理的时候会将其对应的实现展开

int main(int argc, char *argv[])
{
	printf("this is main!\n");

	fun1();
	fun2();

	return 0;
}

动态库执行时候报错解决

2.Linux编程-库_linux

分析为什么在执行的时候找不到libtest2.so库

当系统加载可执行代码时候, 能够知道其所依赖的库的名字, 但是还需要知道所依赖的库的绝对路径。此时就需要系统动态载入器(dynamic linker/loader)。

ldd命令可以查看可执行文件依赖的库文件, 执行ldd main2, 可以发现libtest2.so找不到.

2.Linux编程-库_运维_02

对于elf格式的可执行程序,是由ld-linux.so*来完成的, 它先后搜索elf文件的 DT_RPATH段 — 环境变量LD_LIBRARY_PATH — /etc/ld.so.cache文件列表 — /lib/, /usr/lib目录找到库文件后将其载入内存。

使用file命令可以查看文件的类型: file main2

2.Linux编程-库_服务器_03

如何让系统找到共享库

  • 拷贝自己制作的共享库到/lib或者/usr/lib
  • 临时设置LD_LIBRARY_PATH:
  • export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库路径
  • 永久设置, 把export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库路径, 设置到∼/.bashrc文件或者/etc/profile文件中
  • 将其添加到 /etc/ld.so.cache文件中
    编辑/etc/ld.so.conf文件, 加入库文件所在目录的路径
    运行sudo ldconfig -v, 该命令会重建/etc/ld.so.cache文件

解决了库的路径问题之后, 再次ldd命令可以查看可执行文件依赖的库文件, ldd main2:

2.Linux编程-库_动态库_04


标签:文件,fun1,lib,fun2,编程,so,Linux,main
From: https://blog.51cto.com/zaishu/11898903

相关文章

  • springboot 编程事务的封装
    一、创建事务管理工具类java复制importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Component;importorg.springframework.transaction.PlatformTransactionManager;importorg.springframework.transaction.Transact......
  • 【树莓派开发】使用树莓派在Linux环境下编写C语言代码
    文章目录前言1.创建test.c文件2.编译运行该文件3.编译并链接两个源文件结语前言如何使用树莓派编译C语言代码呢?21年暑假的时候,学习编程的劲头高涨,然后冲动消费买了个树莓派4B……结果压根不会用,吃灰了半年不过现在已经学完了C语言,也接触了一丢丢Linux系统下的gcc指令,可以尝试用它......
  • linux PS1
    最近不小心动了环境变量的PS1老是感觉很奇怪然后研究了一下PS1可以支持以下这些选项:\d:显示曰期,格式为"星期月日"。\H:显示完整的主机名。如默认主机名"localhost.localdomain"。\h:显示简写的主机名。如默认主机名"localhost"。\t:显示24小时制时间,格式为"HH:MM:SS"。......
  • 【话题讨论】VS Code:倍增编程动力,实现效率飞跃
      目录引言一、详情介绍功能特点使用场景提高工作效率二、效率对比2.1高度可定制性与丰富的插件生态2.2智能的代码补全与导航2.3 内置的调试器与版本控制集成2.4 轻量级与跨平台2.5选择合适工具的重要性2.6实际案例或数据展示三、未来趋势3.1编程工具......
  • Archlinux的安装
    事先申明archlinux是一个自由度很高的系统,这篇文章仅是我个人习惯!!1.U盘的制作archlinux系统的下载直接上官网上找哈!ArchLinux-Downloads下载好了以后呢,我们还需要一个U盘,大小嘛16G以上吧(我个人认为哈)我们要创作启动盘哈在windows系统里我们要先下一个烧录软件Index......
  • 阿里云上,给Linux系统增加SSH密钥对认证
    背景:当前使用密码认证。准备:确保能够使用root进行SSH登录。绑定密钥对:在阿里云控制台,打开ecs实例详情,点击全部操作按钮,选择绑定密钥对,该密钥对的公钥会被自动上传到/.ssh/authorized_keys.在putty上配置私钥,并使用root远程登陆。将密钥对的公钥复制到普通用户user1的目录下,......
  • WEB渗透Linux提权篇-提权工具合集
     往期文章WEB渗透Linux提权篇-环境变量提权-CSDN博客工具合集工具名称下载地址工具描述BadPotatohttps://github.com/BeichenDream/BadPotatoWindows权限提升BadPotatoDatabasetoolshttps://github.com/Hel10-Web/Databasetools一款用Go语言编写的数据库自动化提权工具,......
  • 【Linux】————Makefile编写
                                 作者主页:   作者主页                           本篇博客专栏:Linux                ......
  • Linux驱动开发基础(DS18B20温度模块)
    所学来自百问网目录1.DS18B20简介2.硬件设计3.软件设计3.1 存储器介绍3.2 通信时序3.2.1初始化时序3.2.2写时序3.2.3 读时序3.3常用命令4.示例代码4.1驱动代码4.2应用代码4.3Makefile4.4实验效果1.DS18B20简介DS18B20温度传感器具有线路简单......
  • Linux驱动开发基础(IRDA 红外遥控模块)
    所学来自百问网 目录1.红外遥控简介2.硬件设计3.软件设计4.示例代码4.1驱动代码4.2Makefile4.3实验效果1.红外遥控简介红外遥控被广泛应用于家用电器、工业控制和智能仪器系统中,像我们熟知的有电视机盒子遥控器、空调遥控器。红外遥控器系统分为发送端和接收......