g++编译静态库与动态库

news2024/11/19 1:51:57

该文目的是基本理清一个在linux在c++静态库与动态库的编译和使用

一个非常基础的一节,简单的整合了一下目前已有的文章

前提准备:

文件:

touch SoDemoTest.h one.cpp two.cpp three.cpp main.cpp

代码

/* SoDemoTest.h */
#ifndef _SO_DEMO_TEST_HEADER_
#define _SO_DEMO_TEST_HEADER_
#include <iostream>
using namespace std;
void one();
void two();
void three();
#endif
/* one.cpp */
#include "SoDemoTest.h"
void one(){
    cout << "call one() function" << endl;
}
/* two.cpp */
#include "SoDemoTest.h"
void two(){
    cout << "call two() function" << endl;
}
/* three.cpp */
#include "SoDemoTest.h"
void three(){
    cout << "call three() function" << endl;
}
/* main.cpp */
#include "SoDemoTest.h"
int main(){
    one();
    two();
    three();
    return 0;
}

开始尝试:

动态库编译

编译生成动态库 : g++ one.cpp two.cpp three.cpp -fPIC -shared -o libtest.so
编译链接动态库 : g++ main.cpp -L. -ltest -o main

(此时进入分歧1,后面进行阐述,如若只为了编译链接成功可以不看)

将动态库放入库目录 : sudo cp liblibtest.so /usr/lib/
测试运行 : ./main

此时就可以正确运行啦~

参数命令解释

-shared :指定生成动态链接库

-fPIC: 表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时事通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码共享的目的。

-o 为生成文件重命名,否则默认为a.out

-L :表示要链接的库所在的目录。-L. 表示要链接的库在当前目录, -L/usr/lib 表示要连接的库在/usr/lib下。目录在/usr/lib时,系统会自动搜索这个目录,可以不用指明

-l (L的小写):表示需要链接库的名称,注意不是库文件名称,比如库文件为 libtest.so,那么库名称为test,也因此推荐对库文件的命名规则为libxxx.so,因为这也是-l默认识别文件名称格式,在编译选项中也可以直接用-lxxx就行了

回顾分歧1

文件成功链接动态库生成可执行文件后,如果我们不把动态库放入库目录,一般都会出现意外情况,比如我们查看链接情况,输入命令ldd main
在这里插入图片描述
可以很清楚看到这里第二行出现 libtest.so=>not found

因为这个程序不知道去哪找这个动态库,它只会去那些默认的地方找动态库,比如在/usr/lib目录中。可以简单想想看,如果不修改系统寻找动态库目录的环境变量(比如LD_LIBRARY_PATH)或者增添动态库文件搜索路径/etc/ld.so.conf,又或不把我们生成的so文件导入到默认目录中,程序也能正常运行的话,那不就跟链接静态库一样了么。。。

静态库编译

编译生成目标文件 : g++ -c one.cpp two.cpp three.cpp main.cpp
创建静态库 : ar cqs libtest.a one.o two.o three.o
目标文件与静态库链接 : g++ main.o -L. -ltest -o static_main (main.o也可以换成main.py)
测试运行 : ./static_main

此时就可以正确运行啦~

参数命令解释

-c : g++将源文件变为目标文件,在流程上目标文件是由汇编代码经过汇编器得来,其中汇编代码一般是由编译器得来,目标文件只要再经过连接器ld就能变为可执行文件了





参考资料

surgewong : gcc/g++ 链接库的编译与链接

逆光倾城 : Linux程序运行找不到动态库.so文件的三种解决办法

GCC 参数详解

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

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

相关文章

【Ubuntu22.04】内网部署Ubuntu Server 22.04.2

镜像下载 方式一&#xff1a;官网下载 https://ubuntu.com/download/server 方式二&#xff1a;清华镜像站 https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/22.04.2/ 方式三&#xff1a;百度网盘 链接: https://pan.baidu.com/s/1g24PDfAiPVsxMm7DVpERdg?pwd1020 …

myql的三种删除方式:delete truncate drop

前言 在 MySQL 中&#xff0c;删除的方法总共有 3 种&#xff1a;delete、truncate、drop&#xff0c;而三者的用法和使用场景又完全不同&#xff0c;接下来我们具体来看。 1.delete detele 可用于删除表的部分或所有数据&#xff0c;它的使用语法如下&#xff1a; delete …

独立产品灵感周刊 DecoHack #052 - 100个AI 工具导航网站

本周刊记录有趣好玩的独立产品设计开发相关内容&#xff0c;每周发布&#xff0c;往期内容同样精彩&#xff0c;感兴趣的伙伴可以 点击订阅我的周刊。为保证每期都能收到&#xff0c;建议邮件订阅。欢迎通过 Twitter 私信推荐或投稿。 ❤️ 刚换工作再加上个人原因有些自己的事…

消息队列中间件 - 详解RabbitMQ6种模式

RabbitMQ 6种工作模式 对RabbitMQ 6种工作模式(简单模式、工作模式、订阅模式、路由模式、主题模式、RPC模式)进行场景和参数进行讲解&#xff0c;PHP代码作为实例。 安装 客户端实现&#xff1a;添加扩展&#xff0c;执行composer.phar install命令 {"require":…

SSM框架学习-bean实例化

实例化bean的三种方式 1. 构造方法&#xff08;常用&#xff09; Spring创建bean调用的是无参的构造方法&#xff0c;且无论该无参构造方法是公有还是私有的&#xff0c;都可以调用&#xff08;底层实现原理为反射&#xff09; 2. 静态工厂&#xff08;了解&#xff09; 要配置…

【论文阅读-Low-code LLM】使用LLM进行可视化编程

Low-code LLM: Visual Programming over LLMs link: https://arxiv.org/abs/2304.08103 repository: https://github.com/microsoft/TaskMatrix/tree/main/LowCodeLLM 摘要 大规模预训练模型&#xff08;LLMs&#xff09;在解决困难问题仍具有很大的挑战。这篇文章提出了可以…

lua | 数据类型与变量

目录 一、数据类型 8个基本类型 1.nil(空&#xff09; 2.boolean&#xff08;布尔&#xff09; 3.number(数字&#xff09; 4.string(字符串&#xff09; 5.table&#xff08;表 &#xff09; 6.function&#xff08;函数&#xff09; 7.thread(线程&#xff09; 8.u…

FIR滤波

参考来源&#xff1a; https://www.zhihu.com/question/323353814 本节主要围绕以下几个问题进行描述&#xff1a; 什么是FIR滤波器时域的卷积频域的相乘 关于FIR FIR滤波就是在时域上卷积的过程。将含噪声信号与低通滤波器的傅里叶逆变换值进行卷积&#xff0c;这个过程就是…

29 - 打家劫舍问题

文章目录 1. 打家劫舍I2. 打家劫舍II3. 打家劫舍III(1) 暴力递归超时(2) 记忆化搜索超时(3) 动态规划 1. 打家劫舍I 动态规划&#xff1a; dp[i] max(dp[i - 2] nums[i], dp[i - 1]); class Solution { public:int rob(vector<int>& nums) {if(nums.size() 1) re…

密码学:分组密码.(块密码:是一种对称密码算法)

密码学&#xff1a;分组密码. 分组加密(Block Cipher) 又称为分块加密或块密码&#xff0c;是一种对称密码算法&#xff0c;这类算法将明文分成多个等长的块 (Block) &#xff0c;使用确定的算法和对称密钥对每组分别加密或解密。分组加密是极其重要的加密体制&#xff0c;如D…

CE游戏特例说明

1.CE修改游戏特例说明 模拟器游戏不能直接修改游戏的程序代码&#xff08;即不能直接使用代码注入的手段修改code段代码&#xff09;&#xff0c;因为游戏并非使用平台语言所写&#xff0c;只有模拟器是使用平台语言写的&#xff0c;即壳是汇编写的&#xff0c;壳用来翻译跨平台…

设计模式 -- 中介者模式

前言 月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂) 央是一片海洋,海乃百川,代表着一块海绵(吸纳万物) 泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出) 月央泽,学习的一种过程,从白纸->吸收各种知识->不断输入输出变成自己的内容 希望大家一起坚持这个过程,也同…

瑞芯微RK3568开发板在智慧交通行业中的应用方案

智能交通安全监测系统是通过利用高性能处理器和先进的图像处理算法&#xff0c;实现对交通场景的实时监测、分析和预警&#xff0c;以提高交通安全水平。以下是基于RK3568处理器的智能交通安全监测系统产品的应用方案&#xff1a; 视频采集与处理&#xff1a; 使用RK3568处理器…

验证码短信 API 接入指南:Java 语言示例代码

短信验证码是一种通过短信发送的验证码&#xff0c;通常用于验证用户的身份、保障账户安全和防止恶意攻击等。短信验证码已经成为现代社会中不可或缺的一部分&#xff0c;广泛应用于各种场景&#xff0c;包括用户注册和登录、找回密码等等。 为了满足企业在账户安全验证和业务…

(详解)Object.keys() Object.values() Object.entries()

目录 一、Object.keys(obj) 二、Object.values() 三、Object.entries() 一、Object.keys(obj) 参数&#xff1a;要返回其枚举自身属性的对象返回值&#xff1a;一个表示给定对象的所有可枚举属性的字符串数组 处理对象&#xff0c;返回可枚举的属性数组 let person {name:…

【机器学习实战】Python基于K均值K-means进行聚类(九)

文章目录 1 前言1.1 K-means的介绍1.2 K-means的应用 2 demo实战演示2.1 导入函数2.2 创建数据2.3 拟合聚类2.4 查看结果 3 使用高级技术评估集群性能*3.1 导入函数3.2 整合数据3.3 计算 4 讨论 1 前言 1.1 K-means的介绍 K均值&#xff08;K-means&#xff09;是一种基于距离…

改写句子的软件有哪些-免费改写文章的软件

改写句子的软件 改写句子的软件是一种广泛应用于文字处理的工具&#xff0c;其主要作用是通过对原文中的语言结构和表述方式进行调整和优化&#xff0c;以改进文章的质量和可读性。改写句子的软件广泛用于新闻报道、科学文章、学术论文、书籍等各类文本材料中&#xff0c;旨在…

Elasticsearch的索引库和文档操作、RestClient的索引库和文档操作

一、Elasticsearch Linux系统通过Docker安装Elasticsearch、部署kibana 1.Elasticsearch Elasticsearch 是位于 Elastic Stack 核心的分布式搜索和分析引擎。Logstash 和 Beats 有助于收集、聚合和丰富您的数据并将其存储在 Elasticsearch 中。Kibana 使您能够以交互方式探索…

梅果提取物激增2782%?因字成分崛起|3月功效成分TOP100

全文速览 全文字数&#xff1a;6015字 阅读时长&#xff1a;8-12分钟 1.目前已有11款新原料成分进入监测期&#xff0c;三月新原料备案占比达27.1%。 2.天赐高新成为仅次于美国路博润的全球第二大卡波姆供应商&#xff0c;市占率将近两成。 3.氨基酸洗面奶凭多重功效替代皂…

Flink Dashboard的数据监控功能

一、数据反压 1.1 数据反压是啥 数据反压是在实时数据处理中&#xff0c;数据处理流的某个节点上游产生数据的速度大于该节点处理数据速度&#xff0c;导致数据堆积&#xff0c;从该节点向上游传递&#xff0c;一直到数据源&#xff0c;并降低数据源的摄入速度。导致数据反压…