Linux学习——静态库与动态库的打包

news2025/3/14 1:08:24

目录

​编辑

一,动静态库介绍

1,动静态库的特点

二,静态库的打包

计算器示例

编译:

1,直接编译

2,打包

三,动态库打包

计算器示例:同上

编译:

1,直接编译:同上

2,动态库打包的方式

在写库的人在库文件所在位置使用时: 

当别人想要使用时:


一,动静态库介绍

1,动静态库的特点

1,在linux中带有.a后缀的便是静态库。带有.so的便是动态库。比如libmymath.a便是一个静态库,libmymath.so便是一个动态库,但是库的名字则是mymath,lib是库前缀。

2,静态库会被加载到可执行程序的内部所以可执行程序会变得很大。动态库则只有一份,可执行程序要使用时需要加载动态库。

3,可执行程序默认使用动态链接,只有在编译时在可执行程序后面加上-static或者只有静态库文件时才会使用静态链接的方式。

示例:

 #include<stdio.h>
  2 int main()
  3 {
  4   printf("hello linux\n");                                                                                                                                                              
  5 }

直接使用gcc编译:

使用加上-static的编译:

 

二,静态库的打包

计算器示例

代码:

add.h:

extern int add(int,int)//函数声明

add.c

  1 #include"add.h"                                                                                                                                                                         
  2                                                                                                
  3 int add(int x,int y)                                                                                               
  4 {                                                                                               
  5   return x+y;                                                                                               
  6 }  

sub.h

extern int sub(int,int);

sub.c

  1 #include"sub.h"                                                                                                                                                                         
  2 int sub(int x,int y)
  3 {
  4   return x-y;
  5 }

test_main.c:

  2 #include"add.h"
  3 #include"sub.h"
  4 
  5 
  6 int main()
  7 {
  8   int x = 10,y = 9;
  9   printf("%d-%d=%d\n",x,y,sub(x,y));
 10   printf("%d+%d=%d\n",x,y,add(x,y));
 11   return 0;
 12 }

编译:

1,直接编译

如果我们想要形成一个可执行文件的话,直接编译便可以了:

 gcc add.c sub.c test_main.c

2,打包

但是这样编译要将.c文件提供给使用者,这样一般是不符合开发时的要求的。开发时一般是不会将源文件提供给别人的,而只会给.h文件和库文件。所以我们就得来打包一番了。

1,打包.o文件:将所有要用到的.o文件打包到libmymath.a文件中。

2,打包.h文件:将所有的.h文件打包到一个include目录下。

Makefile文件代码:

  1  lib=libmymath.a
  2 $(lib):sub.o add.o
  3   ar -rc $@ $^ 
  4 
  5 %.o:%.c
  6   gcc -c $<  
  7 
  8 .PHONY:output
  9 output:
 10   mkdir -p  _lib/include
 11   mkdir -p _lib/mymath
 12   cp -rf *.h _lib/include                                                               
 13   cp -rf *.a _lib/mymath
 14 
 15 .PHONY:clean
 16 clean:
 17   rm -rf *.o *.a

在当前路径下生成静态库 

编译指令:gcc test_main.c -lmymath -L.

打包给别人使用:

 然后便可以像之前在当前路径下使用了。

三,动态库打包

计算器示例:同上

编译:

1,直接编译:同上
2,动态库打包的方式

代码:

  1 lib=libmymath3.so //生成.so为后缀的动态库
  2 $(lib):sub.o add.o
  3   gcc -shared -o $@ $^  //使用gcc -shared命令生成共享库(动态库)                                                                
  4 
  5 %.o:%.c
  6   gcc -fPIC  -c $<  //加上fPIC(与位置无关码)
  7 
  8 .PHONY:output
  9 output:
 10   mkdir -p  _lib/include
 11   mkdir -p _lib/mymath
 12   cp -rf *.h _lib/include
 13   cp -rf *.so _lib/mymath
 14 
 15 .PHONY:clean
 16 clean:
 17   rm -rf *.o *.so _lib 
 18   
在写库的人在库文件所在位置使用时: 

关于第四步:-I(大写的i)是为了链接头文件  -l(小写的L)是为了链接库   -L是为了告诉编译器去哪里找。 

当别人想要使用时:

假如现在是别人想要使用:

当前在test2文件下,_lib是下载后解压得到的。

使用:

能生成可执行文件,但是不能编译,原因是找不到.so文件。

可以使用ldd+可执行程序查看:

解决方式:让可执行程序能够找到动态库

1,将动态库拷贝到系统库中(推荐做法,但不要把自己写的文件塞进去):.so文件拷贝到usr/include路径下   .h文件拷贝到usr/include路径下

2,建立软连接

在当前文件下建立软连接:相对路径。

在系统文件里:要有完整的路径。

3,定义环境变量

定义环境变量然后export。示例:export LD_LIBRARY_PATH = $LD_LIBRARY_PATH:绝对路径

4,找到/etc/ld.so.cnf.d/然后在里面touch一个.cnf文件,然后用sudo vim打开,然后在里面添加动态库的完整路径。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1453567.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

模拟算法.

1.什么是模拟 在信息奥赛中,有一类问题是模拟一个游戏的对弈过程或者模拟一项任务的操作过程.比如乒乓球在比赛中模拟统计记分最终判断输赢的过程等等,这些问题通常很难通过建立数学模型用特定的算法来解决因为它没有一种固定的解法,需要深刻理解出题者对过程的解释一般只能采…

蓝桥杯备赛_python_BFS搜索算法_刷题学习笔记

1 bfs广度优先搜索 1.1 是什么 1.2怎么实现 2案例学习 2.1.走迷宫 2.2.P1443 马的遍历 2.3. 九宫重排&#xff08;看答案学的&#xff0c;实在写不来&#xff09; 2.4.青蛙跳杯子&#xff08;学完九宫重排再做bingo&#xff09; 2.5. 长草 3.总结 1 bfs广度优先搜索 【P…

六、Spring/Spring Boot整合ActiveMQ

Spring/Spring Boot整合ActiveMQ 一、Spring整合ActiveMQ1.pom.xml2.Queue - 队列2.1 applicationContext.xml2.2 生产者2.3 消费者 3.Topic - 主题3.1 applicationContext.xml3.2 生产者3.3 消费者 4.消费者 - 监听器4.1 编写监听器类4.2 配置监听器4.3 生产者消费者一体 二、…

基于PPNSA+扰动算子的车间调度最优化matlab仿真,可以任意调整工件数和机器数,输出甘特图

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于PPNSA扰动算子的车间调度最优化matlab仿真,可以任意调整工件数和机器数,输出甘特图和优化收敛曲线。 2.测试软件版本以及运行结果展示 MATLAB2022a版本运行…

Java毕业设计-基于ssm的网上餐厅管理系统-第72期

获取源码资料&#xff0c;请移步从戎源码网&#xff1a;从戎源码网_专业的计算机毕业设计网站 项目介绍 基于ssm的网上餐厅管理系统&#xff1a;前端jsp、jquery、bootstrap&#xff0c;后端 maven、springmvc、spring、mybatis&#xff0c;集成类名管理、菜品管理、订单管理…

Linux第59步_“buildroot”构建根文件系统第1步_生成rootfs.tar和rootfs.ext4以及通过nfs下载测试

学习安装“buildroot”&#xff0c;通过配置构建根文件系统&#xff0c;编译生成rootfs.tar和rootfs.ext4&#xff0c;以及通过nfs下载测试。 1、了解学习目的&#xff1a; 1)、获取“buildroot”安装包&#xff1b; 2)、使用“buildroot”构建根文件系统&#xff1b; 3)、…

使用Apache ECharts同时绘制多个统计图表

目录 1、介绍 2、相关知识 3、代码 4、效果 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;专注于Java领域学习&#xff0c;擅长web应用开发、数据结构和算法&#xff0c;初步涉猎Python人工智能开发和前端开发。 …

UE Get节点和源码

文章目录 概要UE Get节点有哪些常见的应用场景相关源码 概要 UE Get节点在Unreal Engine的蓝图系统中用于获取变量的值。这个节点通常用于从变量中读取数据&#xff0c;以便在游戏的逻辑流程中使用。 要使用Get节点&#xff0c;你首先需要有一个已经定义的变量。然后&#xf…

Windows环境部署nginx 文件服务器

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 在Windows环境下使用nginx部署简单的文件服务器 一、版本 1. Windows 使用版本 2. nginx 使用版本 选择Mainline Version版本 二、nginx配置 1. 下载 https://nginx.org/en/download.…

Unity 减低GC和优化

文章目录 在Unity中&#xff0c;垃圾收集&#xff08;Garbage Collection, GC&#xff09;是一项重要的内存管理机制&#xff0c;但过度的GC活动可能会导致性能瓶颈。优化Unity项目中的GC涉及减少不必要的对象分配和生命周期管理。以下列举了五个实例来详细说明如何降低GC负担并…

用于图像处理的Python顶级库 !!

文章目录 前言 1、OpenCV 2、Scikit-Image 3、Scipy 4、Python Image Library&#xff08;Pillow / PIL&#xff09; 5、Matplotlib 6、SimpleITK 7、Numpy 8、Mahotas 前言 正如IDC所指出的&#xff0c;数字信息将飙升至175ZB&#xff0c;而这些信息中的巨大一部分是图片。数…

安卓实现简单砸地鼠游戏

效果 布局 <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-auto"xmlns:tools"http://schemas.android.com/tools"android:layout_width"match_parent"a…

开年炸裂-Sora/Gemini

最新人工智能消息 谷歌的新 Gemini 模型 支持多达 1M的Token&#xff0c;可以分析长达一小时的视频 1M Token可能意味着分析700,000 个单词、 30,000 行代码或11 小时的音频、总结、改写和引用内容。 Comment&#xff1a;google公司有夸大的传统&#xff0c;所以真实效果需要上…

【自然语言处理】实验3,文本情感分析

清华大学驭风计划课程链接 学堂在线 - 精品在线课程学习平台 (xuetangx.com) 代码和报告均为本人自己实现&#xff08;实验满分&#xff09;&#xff0c;只展示主要任务实验结果&#xff0c;如果需要详细的实验报告或者代码可以私聊博主 有任何疑问或者问题&#xff0c;也欢…

2024/2/17 图论 最短路入门 dijkstra 1

目录 算法思路 Dijkstra求最短路 AcWing 849. Dijkstra求最短路 I - AcWing 850. Dijkstra求最短路 II - AcWing题库 最短路 最短路 - HDU 2544 - Virtual Judge (vjudge.net) 【模板】单源最短路径&#xff08;弱化版&#xff09; P3371 【模板】单源最短路径&#xf…

文生视频提示词:故事与主题

内容创意 --故事与主题 Story & Theme 这些词汇覆盖了从基本的故事类型到特定的主题和元素&#xff0c;可用于激发创意和定义视频内容的核心主题。 Adventure 冒险 Romance 浪漫 Mystery 神秘 Fantasy 幻想 Science Fiction 科幻 Horror 恐怖 Thriller 惊悚 Comedy 喜剧 Dr…

EXCEL中不错的xlookup函数

excel中一般要经常用vlookup函数&#xff0c;但其实经常麻烦要正序&#xff0c;从左边到右边&#xff0c;还要数列&#xff0c;挺麻烦的&#xff0c;xlookup的函数还不错&#xff0c;有个不错的一套视频介绍,B站的&#xff0c;地址是&#xff1a;XLOOKUP函数基础用法&#xff0…

Python vars函数

在Python编程中&#xff0c;vars()函数是一个常用的内置函数&#xff0c;用于返回对象的__dict__属性。该属性存储了对象的命名空间&#xff0c;包括对象的所有属性和方法。本文将深入探讨Python中的vars()函数&#xff0c;包括基本用法、适用对象、返回结果、实际应用场景&…

MySQL数据库⑪_C/C++连接MySQL_发送请求

目录 1. 下载库文件 2. 使用库 3. 链接MySQL函数 4. C/C链接示例 5. 发送SQL请求 6. 获取查询结果 本篇完。 1. 下载库文件 要使用C/C连接MySQL&#xff0c;需要使用MySQL官网提供的库。 进入MySQL官网选择适合自己平台的mysql connect库&#xff0c;然后点击下载就行…

线程库接口模拟封装(使用参数包接受参数,2种方法)

目录 引入 模拟实现 思路 传递参数包 代码 thread.hpp main.cpp 示例 引入 之前我们一直使用的都是linux中的原生线程库,但c中其实是有提供封装好的线程库的 -- <thread> 下面我们也来试着封装一下线程接口 模拟实现 思路 首先,明确线程库的核心操作: 创建和销毁…