【项目构建】04:动态库与静态库制作

OVERVIEW

      • 1.编译动态链接库
        • (1)编译动态库
        • (2)链接动态库
        • (3)运行时使用动态库
      • 2.编译静态链接库
        • (1)编译静态库
        • (2)链接静态库
        • (3)运行时使用静态库
      • 3.make install

1.编译动态链接库

动态链接库:不会把代码编译到二级制文件中,而是在运行时才去加载,所以只需要维护一个地址即可,

动态库编译完成之后需要发布,否则程序运行时找不到,

windows环境下动态库为.dll、linux环境下动态库为.so

  1. 编译成 .o 文件:g++ -c -fpic soTest.cpp -o soTest.o

  2. 编译动态库:g++ -shared soTest.o -o libsoTest.so

    • -c:得到二进制文件aTest.o
    • -shared:共享
    • -fPIC:产生位置无关的代码,
    • -l:小写l,指定动态库,
    • -L:手动指定库文件搜索目录,默认只链接共享目录,
    • -I:大写i,指定头文件目录(默认当前目录),
  3. 链接成执行文件:

    g++ [.cpp] -l [libName] -L [libPath] -o [test.out]

g++ soTest.cpp -shared -fPIC -o libsoTest.so
(1)编译动态库

文件目录结构如下,将其打包成动态库,

在这里插入图片描述

// soTest.h
#ifndef _SOTEST_H
#define _SOTEST_H#include <iostream>
using namespace std;class soTest {
public:void func1();virtual void func2();virtual void func3() = 0;
};#endif
// soTest.cpp
#include "soTest.h"void soTest::func1()
{cout << "this is func1" << endl;
}void soTest::func2()
{cout << "this is func2" << endl;
}
# makefile
libsoTest.so:$(CXX) soTest.cpp -shared -fPIC -L ./ -o libsoTest.so
clean:$(RM) libsoTest.so

使用make libsoTest.so 命令成功完成对 libsoTest.so 动态库的打包操作,

(2)链接动态库

在动态库成功打包出来之后,在其他项目中通过引入 soTest.hlibsoTest.so文件,来使用打包好的动态库,

文件目录结构如下,将第三方动态库动态载入,编译自己的项目,

在这里插入图片描述

//test.cpp
#include <iostream>
#include "soTest.h"
using namespace std;class Test:public soTest{
public:void func2() {cout << "Test:this is func2" << endl;}void func3() {cout << "Test:this is func3" << endl;}
};int main() {Test t1;t1.func1();t1.func2();t1.func3();return 0;
}
# makefile
test:$(CXX) test.cpp -lsoTest -L ./ -I ./ -o test.out
clean:$(RM) *.out

使用make test 命令成功完成第三方动态库的链接,编译成功目录下出现 test.out 的可执行文件,

(3)运行时使用动态库

由于动态库的特点,若只在编译时使用的动态库,而运行时没有指定动态库位置,则程序将无法正常运行,

即动态库编译完成之后需要进行发布操作,否则程序运行时会找不到动态库位置而产生报错,如下所示:

./a.out: error while loading shared libraries: libsoTest.so: cannot open shared object file: No such file or directory
  • 解决方案1:将动态库so文件拷贝到对应的目录下(发布),才能运行程序

    • linux下默认动态库路径配置文件:/etc/ld.so.conf/etc/ld.so.conf.d/*.conf

    • /usr/lib

    • /usr/local/lib

  • 解决方案2:运行时手动指定动态库的所在目录

    mac环境:

    • DYLD_LIBARY_PATH=./your_lib_path
    • export DYLD_LIBARY_PATH

    linux环境:

    • LD_LIBARY_PATH=./your_lib_path
    • export LD_LIBARY_PATH

在这里插入图片描述

2.编译静态链接库

静态链接库:会将库中的代码编译到二进制文件中,当程序编译完成后,该库文件可以删除,

与静态库不同的是,动态链接库必须与程序同时部署,还要保证程序能正常加载得到的库文件。静态库可以不用部署已经加载到程序中,而且运行时的速度更快,

但是会导致程序体积更大,并且库中的内容如果有更新,则需要重新编译生成程序,

windows环境下动态库为.lib、linux环境下动态库为.a

  1. 编译成 .o 文件:g++ -c aTest.cpp -o aTest.o

  2. 编译静态库:ar -r libaTest.a aTest.o

    • -c:得到二进制文件aTest.o
    • ar:备份压缩命令,将目标文件打包成静态链接库,
    • -r:将文件插入备存文件中,
  3. 链接成执行文件:

    g++ [.cpp] [.a] -o [test.out]

    g++ [.cpp] -l [libName] -L [libPath] -o [test.out]

(1)编译静态库

文件目录结构如下,将其打包成静态库,

在这里插入图片描述

// aTest.h
#ifndef _ATEST_H
#define _ATEST_H#include<iostream>
using namespace std;class aTest{
public:void func1();
};#endif
// aTest.cpp
#include "aTest.h"void aTest::func1()
{cout << "aTest:func1" << endl;
}
# makefile
libaTest.a:$(CXX) -c aTest.cpp -L ./ -I ./ -o aTest.o$(AR) -r libaTest.a aTest.o
clean:$(RM) *.a *.o

使用make libaTest.a 命令成功完成对 libaTest.a 静态库的打包操作,

(2)链接静态库

在静态库成功打包出来之后,在其他项目中通过引入 aTest.hlibaTest.a文件,来使用打包好的静态库,

文件目录结构如下,将第三方静态库动态载入,编译自己的项目,

在这里插入图片描述

// test.cpp
#include <iostream>
#include "aTest.h"
using namespace std;int main() {aTest t1;t1.func1();return 0;
}
# makefile
test:$(CXX) test.cpp -laTest -L ./ -I ./ -o test.out
clean:$(RM) *.out 

使用make test 命令成功完成第三方静态库的链接,编译成功目录下出现 test.out 的可执行文件,

(3)运行时使用静态库

由于静态库的特点,在编译时已经将库中的代码编译到二进制文件中,当编译完成后,该库文件可以删除,并且程序可以直接运行,

在这里插入图片描述

3.make install

  1. make,编译链接:

    将源文件,编译成二进制的可执行文件(包括各种库文件)

  2. make install,配置相关的运行环境:

    创建目录,将可执行文件拷贝到指定目录(安装目录)

    加全局可执行的路径

    加全局的启动停止脚本

  3. make clean

    重置编译环境,删除无关文件

TARGET:=my_test
OBJ:=$(TARGET).osCC:=g++PATHS:=/tmp/test/
BIN:=/usr/local/bin/START_SH:=$(PATHS)$(TARGET)
STOP_SH:=$(PATHS)$(TARGET)$(TARGET):$(OBJ)install:$(TARGET)if [ -d $(PATHS) ];						\then echo $(PATHS) exist;			\else 									\mkdir $(PATHS);						\cp $(TARGET) $(PATHS);				\ln -sv $(PATHS)$(TARGET) $(BIN);	\touch $(LOG);						\chmod a+rwx $(LOG);					\echo "$(TARGET)>$(LOG) & echo $(TARGET) running...">$(PATHS)$(START_SH);	\echo "killall $(TARGET)">$(PATHS)$(START_SH); 								\chmod a+x $(PATHS)$(START_SH);												\chmod a+x $(PATHS)$(STOP_SH);												\ln -sv $(PATHS)$(START_SH) $(BIN);											\ln -sv $(PATHS)$(STOP_SH) $(BIN);											\fi;clean:$(RM) $(TARGET) $(OBJ) $(BIN)$(TARGET) $(BIN)$(START_SH) $(BIN)$(STOP_SH)$(RM) -rf $(PATHS).PHONY:clean install

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

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

相关文章

免费的单片机物联网MQTT平台选择

目的是多设备接入中控&#xff0c;平台只做转发。 选择巴法云&#xff1a;巴法科技&巴法云-巴法设备云-巴法物联网云平台 clientId是私钥uid&#xff1a; 多设备 clientId 填同一个 uid 都是可以的。平台应该是加了后缀区分。 支持自定义topic&#xff0c;操作简单&#x…

2024.5.5 机器学习周报

引言 Abstract 文献阅读 1、题目 SuperGlue: Learning Feature Matching with Graph Neural Networks 2、引言 本文介绍了SuperGlue&#xff0c;这是一种神经网络&#xff0c;它通过联合寻找对应关系并拒绝不匹配的点来匹配两组局部特征。通过求解一个可微的最优运输问题…

TikTok引流中海外云手机的实用功能分享

在当下&#xff0c;TikTok已成为全球范围内最受欢迎的社交媒体平台之一&#xff0c;拥有着庞大的用户群体和潜在的商业机会。为了在TikTok上实现更好的引流效果&#xff0c;利用海外云手机成为了一个明智的选择。接下来&#xff0c;我们将深入探讨海外云手机的功能以及它如何助…

跳出框架:Facebook的创新策略与社交影响

1. 引言 在数字化时代&#xff0c;社交媒体如同一面镜子&#xff0c;反映出我们社会的多元性和变革。Facebook&#xff0c;作为这面镜子中最明亮的一个&#xff0c;不仅改变了人们的日常生活&#xff0c;更深刻地塑造了社交、文化和经济的面貌。本文将深入探讨Facebook的创新策…

Maven3.9.6下载安装教程

(/≧▽≦)/~┴┴ 嗨~我叫小奥 ✨✨✨ &#x1f440;&#x1f440;&#x1f440; 个人博客&#xff1a;小奥的博客 &#x1f44d;&#x1f44d;&#x1f44d;&#xff1a;个人CSDN ⭐️⭐️⭐️&#xff1a;Github传送门 &#x1f379; 本人24应届生一枚&#xff0c;技术和水平有…

BST二叉搜索树

概念 二叉搜索树&#xff08;Binary Search Tree&#xff0c;简称BST&#xff09;&#xff0c;又称为二叉排序树或二叉查找树&#xff0c;是一种特殊的二叉树数据结构。它具有以下基本性质&#xff1a; 节点的值的有序性&#xff1a;对于BST中的任意一个节点&#xff0c;其左…

交通 | 电动汽车车辆路径问题及FRVCP包的调用以及代码案例

编者按&#xff1a; 电动汽车的应用给车辆路线问题带来了更多的挑战&#xff0c;如何为给定路线行驶的电动汽车设计充电决策是一个需要解决的难题&#xff0c;本文介绍了开源python包frvcpy使用精确式算法对该问题求解。 文献解读&#xff1a;Aurelien Froger, Jorge E Mendo…

H.265 与 H.264 的主要区别

H.265 与 H.264 的主要区别 H.265 与 H.264 的主要区别各模块技术差异汇总宏块划分帧内预测模式帧间预测模式去块滤波ALF自适应环路滤波采样点自适应偏移&#xff08;Sample Adaptive Offset&#xff09;滤波并行化设计TileEntropy sliceDependent SliceWPP&#xff08;Wavefro…

红米A2/A2+/POCO C51手机秒解BL+快速获取root权限+解谷歌锁刷机救砖教程

红米A2/A2/POCO C51手机是目前小米公司针对于国外用户的1个独立的品牌&#xff0c;或者和国内的红米手机都非常相似&#xff0c;几款手机由于硬件非常接近&#xff0c;我们这里将其放在一起和大家介绍而从他们的代号中我们可以得知&#xff0c;目前A2/POCO的代号为water&#x…

Text-to-SQL小白入门(12)Awesome-Text2SQL开源项目star破1000

项目介绍 项目地址 23年9月份刚开源这个项目&#xff0c;大半年过去了&#xff0c;star数终于破1000啦&#xff0c;决定在知乎更新一下内容&#xff0c;看看内容变化&#xff0c;知乎有上当时项目介绍的链接&#xff1a;追光者&#xff1a;Text-to-SQL小白入门&#xff08;六&…

水稻病害检测(YOLO数据集,多分类,稻瘟病、纹枯病、褐斑病、枯心病、霜霉病、水稻细菌性条纹斑病、稻苞虫)

是自己利用LabelImg工具进行手工标注&#xff0c;数据集制作不易&#xff0c;请尊重版权&#xff08;稻瘟病、纹枯病、褐斑病、枯心病、霜霉病、水稻细菌性条纹斑病、稻苞虫&#xff09; 如果需要yolv8检测模型和数据集放在一起的压缩包&#xff0c;可以关注&#xff1a;最新最…

汽车车灯的材料是什么?汽车车灯的灯罩如果破损破裂破洞了要怎么修复?

汽车车灯的材料主要包括灯罩和灯底座两部分&#xff0c;它们所使用的材料各不相同。 车灯罩的材料主要是透明且具有良好耐热性和耐紫外线性能的塑料。其中&#xff0c;聚碳酸酯&#xff08;PC&#xff09;是一种常用的材料&#xff0c;它具有高抗冲击性、耐化学品腐蚀和优良的…

【C++庖丁解牛】C++11---lambda表达式 | 包装器

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1. lambda表达式1.1 C98中…

数字旅游打造个性化旅行体验,科技让旅行更精彩:借助数字技术,旅行者可以定制专属旅行计划,享受个性化的旅行体验

目录 一、引言 二、数字旅游的兴起与发展 三、数字技术助力个性化旅行体验 1、智能推荐系统&#xff1a;精准匹配旅行者需求 2、定制化旅行计划&#xff1a;满足个性化需求 3、实时互动与分享&#xff1a;增强旅行体验 四、科技提升旅行便捷性与安全性 1、移动支付与电…

28.Gateway-网关过滤器

GatewayFilter是网关中提供的一种过滤器&#xff0c;可以多进入网关的请求和微服务返回的响应做处理。 GatewayFilter(当前路由过滤器&#xff0c;DefaultFilter) spring中提供了31种不同的路由过滤器工厂。 filters针对部分路由的过滤器。 default-filters针对所有路由的默认…

重定义大语言模型的记忆能力:对抗性压缩如何挑战现有测量法

DeepVisionary 每日深度学习前沿科技推送&顶会论文分享&#xff0c;与你一起了解前沿深度学习信息&#xff01; Rethinking LLM Memorization through the Lens of Adversarial Compression 引言&#xff1a;探索大型语言模型的记忆能力 在当今信息时代&#xff0c;大型…

Pyspark+关联规则 Kaggle购物篮分析案例

数据集地址&#xff1a;Market Basket Analysis | Kaggle 我的NoteBook地址&#xff1a;pyspark Market Basket Analysis | Kaggle 零售商期望能够利用过去的零售数据在自己的行业中进行探索&#xff0c;并为客户提供有关商品集的建议&#xff0c;这样就能提高客户参与度、改…

50. 【Android教程】xml 数据解析

xml 是一种标记扩展语言&#xff08;Extension Mark-up Language&#xff09;&#xff0c;学到这里大家对 xml 语言一定不陌生&#xff0c;但是它在 Android 中的运用其实只是冰山一角。抛开 Android&#xff0c;XML 也被广泛运用于各种数据结构中。在运用 xml 编写 Android 布…

【氮化镓】GaN器件在航天器高可靠正向转换器中应用

文章是发表在《IEEE Journal of Emerging and Selected Topics in Power Electronics》2022年10月第10卷第5期上的一篇关于GaN(氮化镓)器件在航天器高可靠性正向转换器中应用的研究。文章的作者是匹兹堡大学电气与计算机工程系的Aidan Phillips, Thomas Cook和Brandon M. Gra…