linux系统下C/C++静态库和动态库的制作及使用

news2024/10/5 20:18:57

C/C++静态库和动态库的制作及使用

  • 1 静态库的制作
    • 静态库简介
    • 1.1 编写源码
    • 1.2 生成目标文件
    • 1.3 ar归档,打包成静态库
    • 1.4 查看静态库
    • 1.5 测试静态库
    • 1.6 运行测试
  • 2 动态库
    • 2.1 编写 Makefile
    • 2.2 编译链接动态库

1 静态库的制作

静态库简介

一般情况下,为了更好的支持开发,第三方库或者是语言库都必须提供静态库和动态库(eg:C C++等官方库),这是方便程序员根据需求功能进行可执行文件的生成;
动态链接使用动态库,而静态链接使用静态库。
一般来说,我们gcc编译默认是动态链接的而如果加上-static选项,那么生成的可执行文件将为静态生成;

1.1 编写源码

add.cpp

int add(int a,int b)
{
   return a + b;
}

sub.cpp

int sub(int a,int b)
{
  	return a - b;
}

1.2 生成目标文件

g++ -c add.cpp -o add.o
g++ -c sub.cpp -o sub.o

在这里插入图片描述

1.3 ar归档,打包成静态库

ar -r -c libcal.a *.o

在这里插入图片描述

1.4 查看静态库

ar -t -v libcal.a

在这里插入图片描述

1.5 测试静态库

#include <iostream>
using namespace std;
#include "sub.h"
#include "add.h"
int main()
{
    int iVal1 = 200;
    int iVal2 = 100;
    cout << sub(iVal1,iVal2) << endl;
    cout << add(iVal1,iVal2) << endl;
    return 0;
}

编译链接

g++ -o test test.cpp -I ./lib/ -L ./lib/ -l cal -static
  • -I (大写i) 指定路径:告知g++除了默认路径之外,还要去寻找这个指定路径的头文件。
  • -L + 指定路径 除默认库路径以外,需要寻找我们这个库的存放路径
  • -l(小写L) 库名称:表示要具体链接的是哪一个库,即库的具体名称;(因为路径下库可能不止一个)
  • -static 打包成静态库

在这里插入图片描述
编译链接过程中出现以上报错的解决办法

### 安装 glibc-static libstdc++
yum install glibc-static libstdc++-static

再次进行编译链接就不会报错

1.6 运行测试

在这里插入图片描述
删除动态库之后同样可以运行

2 动态库

2.1 编写 Makefile

代码的跟静态库的是一样的 可以直接进行动态库的制作

libcal.so:add.o sub.o
       ###################
       ## $@ -- 目标文件
       ## $^ -- 所有的依赖文件
       ## $< -- 第一个依赖文件
       ## g++ 带上-shared选项表示生成共享动态库格式
       ###################
       @echo target=$@
       g++ -shared -o $@ $^
add.o:add.cpp
       @echo target=$@
       g++ -fPIC -c $^
sub.o:sub.cpp
       @echo target=$@
       g++ -fPIC -c $^
clean:
       rm *.o libcal.so

在这里插入图片描述

2.2 编译链接动态库

g++ -o test test.cpp -I ./lib/ -L ./lib/ -l cal

运行可执行程序

./test
./test: error while loading shared libraries: libcal.so: cannot open shared object file: No such file or directory

执行之后发现程序找不到动态库!!!

这属于运行问题,其实运行时系统也会去默认路径下找到我们所使用的动态库,但在默认路径下没有我们的库

解决办法
修改环境变量LD_LIBRARY_PATH,将动态库所在路径.lib添加到该环境变量中,这样程序在运行时系统就能够找到动态库,从而运行成功

## 
vim ~/.bashrc
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/mysqlTest/lib_test/lib
source ~/.bashrc

执行

./test
[mysql@chao_2 /home/mysql/mysqlTest/lib_test]$./test
100
300

运行结果正确!!!

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

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

相关文章

LC正弦波振荡器【高频电子线路】【Multisim】

目录 一、实验目的与要求 二、实验仪器 三、实验内容与测试结果 1、观察起振过程 2、观测稳定的输出波形及振荡频率的变化 3、测试静态工作点对起振和输出幅度的影响 4、测试回路电容对振荡频率和输出幅度的影响&#xff0c;并理论上给出解释 四、实验结果分析 一、实验…

【社区图书馆】【图书活动第四期】

目录 一、前言 二、作者简介 三、《PyTorch高级机器学习实战》内容简介 四、书目录 一、前言 今天&#xff0c;偶尔逛到csdn社区图书馆&#xff0c;看到有活动 “【图书活动第四期】来一起写书评领实体奖牌红包电子勋章吧&#xff01;”&#xff08;活动到今天结束&#xf…

荔枝派Zero(全志V3S)开启 SSH 实现远程连接和文件传输

文章目录 前言一、配置 buildroot二、编译 buildroot三、拷贝到 SD 卡四、测试 ssh1、修改 /etc/ssh/sshd_config 文件2、运行 /usr/sbin/sshd3、使用 SecureCRT 测试4、使用 SecureFx 测试 前言 本文将在 Buildroot 根文件系统开启 ssh 功能。 一、配置 buildroot 1、在 bui…

《软件测试》[Ron Patton](一)-软件测试背景、软件开发过程、软件测试基础

《软件测试&#xff08;原书第2版&#xff09;》作者: [美] Ron Patton 这本书是软件测试入门的经典书籍。我在刚入行时&#xff0c;也读过这本书&#xff0c;受益匪浅。并且即使是工作了这么多年&#xff0c;再回头看这本书&#xff0c;会发现怎么都逃不出这本书的范围。这个系…

【视频教程解读】Window上安装和使用autogluon V0.4

1.使用conda安装的python环境 教程使用的是极简版miniconda,由于我们的电脑中安装了anaconda&#xff0c;所以不需要进行进一步安装。python版本为3.9&#xff0c;博客里面有anaconda和python版本的对应关系。注意查看版本autogluon V0.4需要3.8或者3.9和3.10&#xff0c;pip版…

Linux:网络基础1

网络协议分层 所有网络问题&#xff0c;本质都是通信距离变长了&#xff0c;为了尽可能减少通信成本&#xff0c;定制了协议。 协议分层的优势&#xff1a; 软件设计方面的优势 - 低耦合 一般我们的分层依据: 功能比较集中&#xff0c;耦合度比较高的模块-- 一层 &#xff0c…

【Vue 基础】尚品汇项目-03-home首页搭建(全局组件与局部组件)

1. 完成三级联动组件&#xff08;全局组件&#xff09; 由于三级联动组件在Home、Search、Detail中都需使用&#xff0c;因此将三级联动组件作为全局组件&#xff0c;这样只需要注册一次&#xff0c;就可以在项目任意地方使用。 新建“home/TypeNav/index.vue”&#xff0c;写…

深度学习技巧应用10-PyTorch框架中早停法类的构建与运用

大家好,我是微学AI,今天给大家介绍一下深度学习技巧应用10-PyTorch框架中早停法类的构建与运用,文章将介绍深度学习训练过程中的一个重要技巧—早停法,以及如何在PyTorch框架中实现早停法。文章将从早停法原理和实践出发,结合实际案例剖析早停法的优缺点及在PyTorch中的应…

[创新工具和方法论]-02- DOE实验设计步骤

文章目录 1.DOE设计1.1 基于OFAT的传统实验设计&#xff1a;1.2 基于DoE的现代实验设计&#xff1a;1.3 DOE和OFAT的比较1.4 如何利用好DOE1.4.1 规划1.4.2 筛选1.4.3 表征1.4.4 优化1.4.5 确认 2. 步骤2.1陈述实际的问题和实验的目的2.2因果链分析,提取重要的因子2.3选择Y的响…

永磁同步电机(PMSM)无传感器控制基于滑膜观测器Matlab/Simulink仿真分析

文章目录 前言一、状态观测器二、滑膜状态观测器2.1.滑膜观测器的原理2.2.传统的滑膜观测器2.3.改进的滑膜观测器 三、Matlab/Simulink仿真分析3.1.仿真电路分析3.1.1 电机控制模式切换3.1.2 速度环控制3.1.3 电流环控制3.1.4 电机主电路 3.2.仿真结果分析 总结 前言 本章节采…

跳跃游戏 (DFS->记忆化搜索->动态规划/贪心证明)

一.跳跃游戏简单介绍 1. 跳跃游戏简单介绍 跳跃游戏是一种典型的算法题目&#xff0c;经常是给定一数组arr&#xff0c;从数组的某一位置i出发&#xff0c;根据一定的跳跃规则&#xff0c;比如从i位置能跳arr[i]步&#xff0c;或者小于arr[i]步&#xff0c;或者固定步数&#…

【HQL - 查询用户的累计消费金额及VIP等级】

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 题目&#xff1a; 从订单信息表(order_info)中统计每个用户截止其每个下单日期的累积消费金额&#xff0c;以及每个用户在其每个下单日期的VIP等级。 用户vip等级根据累积消费金额计算&#xff0…

Unity之OpenXR+XR Interaction Toolkit基本配置

前言 XR Interaction Toolkit 是Unity基于OpenXR标准&#xff0c;发布的一套XR工具&#xff0c;目的是方便我们快速接入XR相关的SDK&#xff0c;并且做到兼容不同VR设备的目的&#xff0c;目前流行的VR设备如Oculus&#xff0c;Metal&#xff0c;HTC Vive&#xff0c;Pico等统…

JavaSE第三章 访问修饰符,Collection,List

这里写目录标题 一 访问修饰符二 集合1.1 数组1.2 集合1.3 读Collection的源码1.3.1 add添加方法1.3.2 clear&#xff0c;size&#xff0c;isEmpty方法1.3.3 remove 方法1.3.4 equals方法与contain方法1.3.5 遍历&#xff0c;迭代器或者增强for循环1.3.6 迭代器重点 1.4 List1.…

numpy的下载、数据类型、属性、数组创建

下载numpy 因为numpy不依赖于任何一个包所以numpy可以直接使用pip命令直接下载 下载命令&#xff1a; pip install numpy # 默认从https://pypi.org/simple 下载 pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple/ # 从清华大学资源站点下载 pip install nump…

一步步解密微商城系统开发流程

作为现代商业的重要组成部分&#xff0c;电子商务系统的建设对于企业的发展至关重要。然而&#xff0c;对于一些小型企业来说&#xff0c;建设一个完整的电子商务系统可能会耗费大量的时间和金钱。微商城系统的出现有效地解决了这个问题&#xff0c;因为它可以在不需要太多资金…

趣说数据结构(练习1) —— 顺序表/链表力扣刷题

练习 1 —— 顺序表/链表力扣刷题 1. 合并两个有序链表 力扣题目地址&#xff1a;https://leetcode.cn/problems/merge-two-sorted-lists/ 问题描述&#xff1a;将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例&#x…

【云计算•云原生】4.云原生之什么是Kubernetes

文章目录 Kubernetes概念Kubernetes核心概念集群podConfigMap Kubernetes架构master节点的组件worker节点组件 Kubernetes网络架构内部网络外部网络 k8s各端口含义 Kubernetes概念 K8S就是Kubernetes&#xff0c;Kubernetes首字母为K&#xff0c;末尾为s&#xff0c;中间一共有…

全球5G市场最新进展及未来展望

从智慧医疗到万物互联&#xff0c;从无人驾驶到关乎我国未来发展的“新基建”&#xff0c;自2019年全球5G商用启动后&#xff0c;5G就步入了发展“快车道”;2022年继续保持快速稳定的增长态势&#xff0c;在网络建设、人口覆盖、终端形态等方面发展势头强劲&#xff0c;在技术标…

1695_week2_算法与函数(MIT使用Python编程学习手记)

全部学习汇总&#xff1a; GreyZhang/python_basic: My learning notes about python. (github.com) 首先说明一下&#xff0c;这部分信息的整理只是我个人的理解。由于自己的知识功底以及英语水准&#xff0c;很可能会有大量的疏漏。再此&#xff0c;我只想把自己学习时候的一…