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

news/2024/5/17 11:58:19

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.mrgr.cn/p/82565368

相关文章

C#反射应用

1.根据类名名称生成类实例 CreateInstance后面的参数部分一定要和所构造的类参数数量对应&#xff0c;即使设置参数默认值&#xff0c;也不可省略。 2.只知道类名&#xff0c;需要将该类作为参数调用泛型接口。 3.只知道类名&#xff0c;需要将该类的数组作为参数调用泛型接口…

php合并时间区间

需要写一段合并时间区间的代码,写个demo记录下 <?php $arr = [["2024-04-16 11:25:46", "2024-04-16 12:19:21"],["2024-04-16 03:14:06", "2024-04-16 10:13:21"],["2024-04-16 13:14:59", "2024-04-16 15:44:46…

罗宾斯《管理学》第15版笔记/课后习题/考研真题答案

第Ⅰ篇 管理导论 第1章 工作场所中的管理者和你 1.1 知识结构导图 1.2 考点难点归纳 1.3 课后习题详解 1.4 考研真题详解 附加模块一 管理史 知识结构导图 考点难点归纳 课后习题详解 考研真题详解 第2章 决 策 2.1 知识结构导图 2.2 考点难点归纳 2.3 课后习题详解…

王道数据结构个人向笔记-第二章(线性表)

目录2.1 线性表的定义和基本操作2.2 顺序表2.2.1 顺序表的定义2.2.2 顺序表的插入、删除(实现是基于静态分配)2.2.3 顺序表的查找2.3 链表2.3.1 单链表的定义2.3.2 单链表的插入删除2.3.3 单链表的查找2.3.4 单链表的建立2.3.4 双链表2.3.5 循环链表2.1 线性表的定义和基本操…

配置 Trunk,实现相同VLAN的跨交换机通信

1.实验环境 公司的员工人数已达到 100 人&#xff0c;其网络设备如图所示。现在的网络环境导致广播较多网速慢&#xff0c;并且也不安全。公司希望按照部门划分网络&#xff0c;并且能够保证一定的网络安全性。 其网络规划如下。 PC1和 PC3为财务部&#xff0c;属于VLAN 2&…

centos7 openresty lua 自适应webp和缩放图片

目录 背景效果图准备安装cwebp等命令&#xff0c;转换文件格式安装ImageMagick&#xff0c;压缩文件下载Lua API 操控ImageMagick的依赖包 代码参考 背景 缩小图片体积&#xff0c;提升加载速度&#xff0c;节省流量。 效果图 参数格式 &#xff1a; ?image_processformat,…

短视频素材哪个App最好?短视频素材哪里有免费的?

在数字媒体的黄金时代&#xff0c;富有创意的视频内容已成为吸引观众的关键。高质量的视频素材不仅能增强视觉效果&#xff0c;还能提升整体叙述的力度。以下列出了一系列全球顶尖的视频素材提供网站&#xff0c;它们将为你的广告制作、社交媒体或任何视频项目提供极具影响力的…

Java安全基础之Java反射机制和ClassLoader类加载机制

反射机制允许程序在运行时检查和操作类、对象、方法以及属性的信息。类加载机制负责将类的字节码加载到内存中,并且在运行时动态地链接和初始化类。目录Java 反射机制反射 java.lang.RuntimeClassLoader 类加载机制URLClassLoaderloadClass() 与 Class.forName() 的区别? Jav…

高中生一定就会了么???(i)

\(题源:2023星光杯数学思维能力测评(小学组)第一试\)\(表示离谱\)

打破失联困境:门店如何利用AI智能名片B2B2C商城小程序重构与消费者的紧密连接?

在如今这个消费者行为日益碎片化的时代&#xff0c;门店经营者们时常感叹&#xff1a;消费者进店如同一场不期而遇的缘分&#xff0c;然而一旦离开门店&#xff0c;就仿佛消失在茫茫人海中&#xff0c;难以再觅其踪迹。这种“进店靠缘分&#xff0c;离店就失联”的困境&#xf…

鸿蒙安装apk软件失败(不支持该设备)

1.关闭纯净模式增强模块 2.给文件管理器一个权限,一个安装外部来源应用的权限魔芋爽要犯了.jpg1.关闭纯净血压增高模块 2.安装外部来源(默认文件管理器是没有权限的) 3.没登华为账号,等七天过了再来试试后续(matepad11.5就是垃圾,快退!.jpg)

Outlook大附件插件 有效解决附件大小限制问题

很多企业都是使用Outlook来进行邮件的收发&#xff0c;可是由于附件大小有限&#xff0c;导致很多大文件发不出去&#xff0c;就会产生Outlook大附件插件这种业务需求。 邮件系统在发送大文件时面临的限制问题主要如下&#xff1a; 1、附件大小限制&#xff1a;大多数邮件服务…

1. SpringBoot 入门

1. SpringBoot 简介 SpringBoot是由Pivotal团队提供的全新框架,可以帮助我们开发基于Spring的、独立的、生产级的应用程序。​ 其中SpringBoot的官网是:Spring Boot Reference DocumentationSpringBoot的主要目标是:为所有Spring开发提供更快的入门体验开箱即用,提供了自动…

uniapp视频播放器(h5+app)

关于uniapp视频播放器遇到的一些问题&#xff0c;mark下。 中途遇到了很多问题&#xff0c;如果有相同的伙伴遇到了类似的&#xff0c;欢迎交流 官方的video播放器在app上不友好&#xff0c;有以下功能不支持。 loadedmetadata、controlstoggle不支持导致只能手写控制层。 不…

mysql连接不上,服务中找不到mysql

分析 因为太久没使用mysql,服务自动删除了解决 注册/安装服务 win+x,a,以管理员打开powershell(或者使用cmd,随你) # 注意此处需要引号,因为有空格 # 1. cd到mysql的可执行文件,如果记不得或者像我一样懒,直接everything搜索mysqld.exe即可 cd C:\Program Files\MySQL\My…

星趴解包教程

目录#1 提取资源文件#2 解密#3 读取资源#4 导出资源#4.1 导出单个 / 少量资源#4.2 按种类导出资源#5 资源去重(可选) 本篇文章偏小白向,有一定基础的可以选择性阅读 本文仅供学习交流使用,请勿用于商业用途。更新至 2024.5.2, 星趴版本号 v1.2.3_20240430_123a#1 提取资源文…

快速了解Django:核心概念解析与实践指南

title: 快速了解Django&#xff1a;核心概念解析与实践指南 date: 2024/5/1 20:31:41 updated: 2024/5/1 20:31:41 categories: 后端开发 tags: Django核心路由系统视图系统ORM管理中间件Web框架登录装饰器 第一章&#xff1a;Django简介 背景和发展历程&#xff1a; Djan…

站立会议和燃尽图10

站立会议和燃尽图10 一、小组情况 组长:李宏威 组员:董泽豪 队名:隐约雷名 二、Scrum例会 时间:2024年4月29日 出席人员:李宏威,董泽豪 要求1 工作照片要求2 时间跨度 2024年4月29日 7:00 至 2024年4月29日 7:20 共计 20 分钟 要求3 地点 石家庄铁道大学 要求4 立会内容包…

【深耕 Python】Data Science with Python 数据科学(17)Scikit-learn机器学习(二)

写在前面 关于数据科学环境的建立&#xff0c;可以参考我的博客&#xff1a; 【深耕 Python】Data Science with Python 数据科学&#xff08;1&#xff09;环境搭建 往期数据科学博文一览&#xff1a; 【深耕 Python】Data Science with Python 数据科学&#xff08;2&…