C++后端技术:编译 静态链接和动态连接

静态连接

在编译时间完成,所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件,通常为“libxxx.a”的形式

粉丝福利, 免费领取C/C++ 开发学习资料包、技术视频/项目代码,1000道大厂面试题,内容包括(C++基础,网络编程,数据库,中间件,后端开发/音视频开发/Qt开发/游戏开发/Linuxn内核等进阶学习资料和最佳学习路线)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

add.h
#ifndef _ADD_H_
#define _ADD_H_
int add(int a, int b);
#endif
add.cpp
#include "add.h"
int add(int a, int b){return a+b;
}
sub.h
#ifndef _SUB_H_
#define _SUB_H_
int sub(int a, int b);
#endif 
sub.cpp
#include "sub.h" 
int sub(int a,int b){ return a-b; 
}
main.cpp
#include "add.h"
#include "sub.h"
#include "iostream"
using namespace std;
int main(){cout<<"1+2="<<add(1,2)<<endl;cout<<"1-2="<<sub(1,2)<<endl;return 0;
}

第一步

将add.cpp与sub.cpp编译成.0文件

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

生成文件add.o sub.o,-c的编译选项,表示只执行到编译,输出目标文件。

第二步

由.o文件创建静态库(.a)文件

ar cr libmymath.a sub.o add.o

会生成libmymath.a文件

第三步

在程序中使用静态库

g++ -o main main.cpp -L. -lmymath

生成目标mian,并运行

动态链接

g++ -fPIC -o add.o -c add.cpp
g++ -fPIC -o sub.o -c sub.cpp
g++ -shared -o libmymath.so add.o sub.o或者一步解决
g++ -fPIC -shared -o libmymath.so add.cpp sub.cpp

生成目标文件

g++ -o main main.cpp -L. -lmymath
./mian

报错error while loading shared libraries: libmymath.so: cannot open shared object file: No such file or directory

因为找不到动态库文件libmymath.so,程序运行时,会在/usr/lib和/lib等目录下查找需要的动态库文件,找到就载入动态库

动态库搜索路径的先后顺序

1、编译目标代码时指定的动态库搜索路径

2、环境变量LD_LD_LIBRARY_PATH指定的动态库搜索路径

3、配置文件/etc/ld.so.conf中指定的动态库搜索路径

4、默认动态库搜索路径/lib

5、默认动态库搜索路径/usr/lib

解决方案

1、将文件libmymath.so复制到/usr/lib中

cp libmymath.so /usr/lib/

2、修改环境变量LD_LIBRARY_PATH

export LD_LIBRARY_PATH=/usr/lib:$LD_LD_LIBRARY_PATH
sudo ldconfig

动态库与静态库的重名问题

有两个库文件libmymath.a和libmymath.so,同名时,会先到path目录下搜索libxxx.so,如果没有找到,则继续搜索libxxx.a(静态库)

静态库和动态库各自的缺点

动态库有利于进程间资源共享

某程序要调用动态库函数,操作系统会首先查看正在运行的程序,看在内存中是否有此函数的拷贝,有的话,就会共享哪一个拷贝。

静态链接库,每个程序需要调用都会拷贝到自己的代码段中

动态库升级简单

只要动态库给该程序的接口没变,只需要重新用新生成的动态库替换原来的就可以。如果是静态库,使用库的函数需要重新编译

动态库链接载入完全由程序员控制

可以明确的指明在什么情况下,载入哪个动态库。有一个很大的软件,每次运行的时候,根据操作需求去将一小部分载入内存

用静态库执行更快

在编译的时候,已经将库函数载到程序中去了,而动态库函数在运行时才被装在。所有在程序执行的时候,用静态库速度更快

粉丝福利, 免费领取C/C++ 开发学习资料包、技术视频/项目代码,1000道大厂面试题,内容包括(C++基础,网络编程,数据库,中间件,后端开发/音视频开发/Qt开发/游戏开发/Linuxn内核等进阶学习资料和最佳学习路线)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

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

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

相关文章

艺术与科技的结合,AI绘画图生图怎么样?

AI绘画图生图是指通过人工智能技术生成的具有艺术价值的图像。它可以根据用户提供的参考图像或描述&#xff0c;自动生成具有艺术风格的新图像。这些图像可以是风景、人物、抽象画等各种形式。那么ai绘画图生图到底怎么样&#xff1f; AI绘画图生图的优点在于它可以快速、高效地…

基于springboot+vue的高校教师电子名片系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

Jenkins Error 403 No valid crumb was included in the request

WARNING hudson.security.csrf.CrumbFilter#doFilter: No valid crumb was included in request for /pluginManager/installPlugins by admin. Returning 403. 找到Jenkins安装目录&#xff0c;我的是centos yum方式安装的&#xff0c;在 /var/lib/jenkins 修改该目录下的co…

ANTLR4规则解析生成器(三):遍历语法分析树

文章目录 1 词法分析2 语法分析3 遍历语法分析树3.1 Listener3.2 Visitor 4 总结 1 词法分析 词法分析就是对给定的字符串进行分割&#xff0c;提取出其中的单词。 在antlr4中&#xff0c;词法规则的名称的首字母需要大写&#xff0c;右侧必须是终结符&#xff0c;通常将词法…

力扣经典题目解析--反转链表

原题地址: . - 力扣&#xff08;LeetCode&#xff09; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 题目解析 链表&#xff08;Linked List&…

仓储管理系统(WMS) 的研发历程-PRD撰写

题外话&#xff1a;PRD的展现形式有多种&#xff0c;有的人喜欢在axure上直接做产品描述&#xff0c;觉得word较为过时&#xff0c;有的人认为axure不专业&#xff0c;任何展现形式都无可厚非&#xff0c;重要的达到PRD的目的&#xff0c;PRD的目标是让团队知道需求实现细节&am…

启动Docker镜像时候,ENTRYPOINT 和CMD这两者指令的写法有什么不同和区别?

ENTRYPOINT和CMD在Dockerfile中都用于指定容器启动时执行的命令&#xff0c;但它们之间存在一些关键的区别和不同的用途&#xff1a; 1. 基本用途和行为差异 ENTRYPOINT 定义了容器启动时执行的基础命令&#xff0c;使得容器像一个可执行程序。ENTRYPOINT让你能够指定容器启动…

抖店类目报白什么意思?什么类目需要报白?这次给你讲明白!

我是电商珠珠 不少新手在选择类目的时候&#xff0c;有些类目却无法选择&#xff0c;系统显示需要报白才可以。那什么是报白&#xff1f;怎么报白&#xff1f;今天我就一次性给你们讲清楚。 抖店类目报白什么意思&#xff1f; 根据官方的说法&#xff0c;报白就是针对一些比…

经验分享:水牛社怎么做?

本人也就是通过他慢慢学习成长起来的。还是一个网友推荐的&#xff0c;现在他对我来说算是大佬了&#xff0c;已经单飞了&#xff0c;好久都没有联系了&#xff0c;呵呵&#xff0c;真是人往高处走&#xff0c;水往低处流啊。 做网赚会经常和一些网络小白聊天&#xff0c;聊着…

回调函数、回调地狱、解放方法Promise的用法

回调函数 回调函数的定义非常简单&#xff1a;一个函数被当做一个实参传入到另一个函数(外部函数)&#xff0c;并且这个函数在外部函数内被调用&#xff0c;用来完成某些任务的函数。就称为回调函数回调函数的两种写法(实现效果相同)&#xff1a; const text () > {docum…

使用Ora2Pg迁移oracle数据到openGauss

下载说明&#xff1a; Perl DBD&#xff1a; http://search.CPAN.org #只需在搜索输入框中输入模块的全名&#xff08;例如&#xff1a;DBD::Oracle、DBD::Pg&#xff09; Ora2Pg&#xff1a;https://ora2pg.darold.net/start.html在Windows下&#xff0c;应该安装Strawbe…

Java中可以实现的定时任务策略

Java中可以实现的定时任务策略 文章目录 Java中可以实现的定时任务策略自定义独立线程JDK提供的调度线程池-**ScheduledExecutorService**内核是Spring的Task执行调度quartz调度 #mermaid-svg-mQ9rPqk0Ds3ULnvD {font-family:"trebuchet ms",verdana,arial,sans-seri…

个人项目介绍4:三维园区篇

个人项目介绍: 地图铁路线路篇 地球卫星篇 火车站篇 三维园区篇 项目需求&#xff1a; 1.按比例全景显示三维园区 2.精确显示园区内设备设施 3.实时显示设备报警信息 4.显示园区内摄像监控设备&#xff0c;并可点击显示监控视频流 5.显示园区内的重大危险源和风险分布 …

ASPICE SYS3架构设计文档编写规范

一、文档目的与范围 本规范旨在指导新能源汽车电池管理系统(BMS)的开发团队按照ASPICE (Automotive SPICE) 的SYS3级别要求来编写详细的系统架构设计文档。文档应涵盖从概念设计到具体实现的所有关键系统架构决策和设计细节,确保系统的可追溯性、完整性及一致性。 二、文…

PCL 路面点云标线提取(C++详细过程版)

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 算法来自本人自创。实现效果如下图所示,具体实现原理看代码即可。 二、代码实现 #include

bean的管理方式

默认情况下&#xff0c;spring项目启动时&#xff0c;会把bean对象全部创建好放到ioc容器 主动获取bean对象&#xff1a;getBean里面传入bean的名称或bean的类型 注意如果没有主动设置bean的名称&#xff0c;则默认名称是对应类名的首字母小写 在ioc容器中&#xff0c;bean对…

Django 视图

请求对象: HttpRequest 对象 get()&#xff1a;返回字符串&#xff0c;如果该键对应有多个值&#xff0c;取出该键的最后一个值。 GET&#xff1a;有相同的键&#xff0c;就把所有的值放到对应的列表里 取值格式&#xff1a;对象.方法。 def runoob(request): name re…

今天分享一个好看的输入法皮肤相信每个人心里住着一个少女心我们美化一下她吧

标题&#xff1a; 白日梦皮肤上线&#xff0c;百度输入法助你开启梦幻之旅&#xff01; 正文&#xff1a; 大家好呀&#xff01;今天我来给大家安利一款超级梦幻的百度输入法皮肤——“白日梦”系列&#xff01; 这款皮肤的设计灵感来源于我们内心深处的白日梦&#xff0c;充…

14. C++继承与虚函数

【继承基础概念】 继承可以让本类使用另一个类的非私有成员&#xff0c;提供共用成员的类称为父类或基类&#xff0c;使用共用成员的类称为子类或派生类&#xff0c;子类创建对象时会包含继承自父类的成员。 继承的优势是减少重复定义数据&#xff0c;当本类需要在另一个类的…

【设计模式】工厂模式与抽象工厂模式

工厂方法 以图书馆管理系统为例&#xff0c;需要API提供查询不同专业分类的书目列表&#xff0c;一般实现&#xff0c; class LibraryManager { public:LibraryManager() {}//按专业分类查询BookList Query(Type type) {if(type TA) {return ...;} else if (type TB) {} el…