C++项目在Linux下编译动态库

news2024/10/6 8:30:58

一、说明

最近在Windows下开发了一个C++线程池项目,准备移植到Linux下,并且编译成动态库进行使用。现将具体过程在此记录。

二、准备

1、项目文件

我的项目文件如下,其中除main.cpp是测试文件之外,其他都是线程池项目相关的

将C++文件移动到Linux中:

2、编译器

要有C++编译器,并适配自己代码中的C++标准。比如我项目中使用了C++17标准,那么所用的g++编译器的版本也要能够支持C++17。如下图,使用g++ -v 可以查看当前编译器版本。

 三、编译

使用命令:

g++ -fPIC -shared threadpool.cpp -o libtdpool.so -std=c++17
  • -fPIC: 这个选项告诉编译器生成位置无关的代码(Position Independent Code)。这对于生成动态链接库(shared libraries)是必须的,因为动态链接库可以在内存中的任何位置被加载。

  • -shared: 这个选项指示编译器生成一个动态链接库(shared object file),而不是一个可执行文件。

  • threadpool.cpp: 这是要编译的源文件。

  • -o libtdpool.so-o 选项后面跟的是输出文件的名称。在这里,输出文件是一个名为 libtdpool.so 的动态链接库。.so 是 Linux 系统上动态链接库的常用扩展名。

  • -std=c++17: 这个选项指定了使用 C++17 标准来编译代码。这意味着编译器会支持 C++17 引入的所有新特性和语法。 

编译完成后查看目录,出现了 libtdpool.so 文件,说明编译成功。现在就不需要threadpool.cpp文件了。

四、移动文件

 Linux中,系统会自动去/usr/local/lib/文件夹中寻找动态库,去/usr/local/include/目录下寻找头文件,所以要将它们移动过去,注意要使用sudo权限。

动态库文件在下图最后一个位置:

所有头文件也在如下目录中:

 五、配置

此时,其他项目还不能直接使用我们准备好的库,虽然能够进行编译,也能够编译出.out文件,但是在运行时会报错:

 这个报错表示运行过程中找不到.so库,这是因为,编译阶段和运行阶段找库的路径是不同的。

在编译阶段会去/usr/local/lib/ 或者 /usr/lib/ 下找,这一阶段我们已经处理好。

在运行阶段,会去 /etc/ld.so.cache 这个缓存文件下找,我们不修改这个缓存文件,但是我们可以通过操作其同目录下的.conf文件

 .conf文件内容:

内容只有一行,表示include .conf.d目录下的所有 .conf文件。我们可以去看下目录下有什么:

 目录下包含几个.conf文件,其中有我刚刚新建的mylib.conf,并在其中将libtdpool.so的路径放进去:

 

这样再使用命令 ldconfig 刷新刚写的.conf文件,将其中的路径全部刷新到前文提到的ld.so.cache文件中。

至此运行 a.out 可执行文件就不再有链接错误。

 六、总结

第五步的配置是经常会碰到的问题,是本次记录的一个重点。

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

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

相关文章

为什么光电测径仪质量更稳定可靠?

光电测径仪与激光扫描式测径仪都是目前常用的外径自动化测量设备,他们能实现的功能相同,但为什么说光电测径仪更稳定可靠,下面一起来看一下。 光电测径仪测量原理 测头部件是测径仪的核心部件,它的作用是将被测物在CCD芯片上清晰…

基于SpringBoot的合家云社区物业管理平台 - 权限管理模块开发

合家云社区物业管理平台 4.权限管理模块开发 4.1 权限管理概述 4.1.1 权限管理的意义 后台管理系统中,通常需要控制不同的登录用户可以操作的内容。权限管理用于管理系统资源,分配用户菜单、资源权限,以及验证用户是否有访问资源权限。 …

【软件测试】采用等价类划分法设计测试用例

例题1 请采用等价类划分法设计测试用例。 考虑软件 app, 它有两个输入变量 , 分别是 name 和 age, 其中 ,name 是至多包含 20 个字母字符的非空字符串 ,age 是整数型变量 ,0 ≤ age ≤ 120 。当输入给 name 的字符串的长度超过 20时 ,name 取前 20 个字符作为 name 的值 ; 如果…

Hotcoin Academy 市场洞察-2024年4月15日-21日

加密货币市场表现 BTC ETF在本周出现净流出,大盘有较大跌幅,BTC一度跌破60000美金,ETH一度跌破2800美金,整体以横盘为主,行情在周末有略微回升趋势。BTC市占率创21年4月来新高,目前市值1.28万亿&#xff0c…

导出瑞芯微(Rockchip)芯片的设备树(Device Tree)

要导出瑞芯微(Rockchip)芯片的设备树(Device Tree),可以使用设备树编译器(DTC,Device Tree Compiler)。通常,会有一个设备树的源文件(.dts)&#…

网络编程-libuv介绍

官网 https://libuv.org/ 概要 libuv是一个强大的跨平台异步I/O库,主要用于构建高性能、可扩展的网络应用程序。它最初是为Node.js开发的,用于处理Node.js的异步I/O操作,但随着时间的推移,它也被广泛应用于其他系统&#xff0…

#1 Numpy Pandas

Numpy & Pandas 2.1 numpy属性2.2 numpy的创建array2.3 numpy的基础运算 调入头文件 import numpy as np2.1 numpy属性 #生成一个array数组 array np.array([[1, 2, 3],[2, 3, 4]])#也可以这样 dtype表示array的元素类型 np.array([1, 2, 3], dtype np.int64) #array维…

AQ6370C YOKOGAWA 横河 光谱分析仪 简述

YOKOGAWA AQ6370C是一款高性能的光谱分析仪,具有世界一流的光学性能。它的波长范围为600至1700nm,能够提供高波长精度0.01nm和高波长分辨率0.02nm。此外,AQ6370C具备大动态范围78dB(典型值)和宽功率量程20~-90dBm&…

安装VCenter 7 对硬件资源的需求

安装VMware vCenter Server 7.x 对硬件资源的需求主要包括以下方面: 服务器硬件: 处理器:64位 x86架构,推荐采用多核CPU以支持高并发管理和运行多个虚拟机。具体数量取决于vCenter Server将管理的虚拟机规模及复杂度。内存&#x…

excel 按照姓名日期年月分组求和

excel 需要按照 姓名 日期的年份进行金额求和统计,采用sumifs 进行统计 注意:sumifs 不支持 合并列拆分计算,合并列只会计算一个值 表格数据大概如下:(sheet) ABC姓名日期金额A2023/01/01500A2023/01/151500B2023/01/01200B202…

Pycharm 函数无法跳转,设置import的路径

想要跳转时报错 可以看到import都报错了,未解析的引用 xxxxx之类的 解决办法: 这个一般是import的路径问题, 这个根目录必填,按照自己的目录填写,如果不填,虽然不会报错,但是也是无法跳转的…

CUDA的开发技术难点

CUDA的开发技术难点不仅包括对并行计算模型的理解,还涉及到内存管理、线程同步、性能优化等多个方面。开发者需要不断学习和实践,才能熟练掌握CUDA编程。CUDA的开发技术难点主要集中在以下几个方面。北京木奇移动技术有限公司,专业的软件外包…

RS®FSH 手持式频谱分析仪

手持式频谱分析仪 R&SFSH -彰显移动性能r- 一体化 灵敏度出色 9 kHz 至 20 GHz 该一体化手持式分析仪非常适合现场的常规测量任务 R&SFSH 手持式频谱分析仪还可以用作网络分析仪、电缆与天线分析仪、干扰捕获分析仪和功率计。这款多功能分析仪可实现简单高效的现…

书生·浦语大模型开源体系(四)笔记

💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢…

【计算机系统结构】指令级高度并行的超级计算机

📝本文介绍 本文将以三种处理机:超标量处理机,超长指令字处理机,超流水线处理机来简要介绍指令高度并行的超级计算机 👋作者简介:一个正在积极探索的本科生 📱联系方式:943641266(QQ…

数据安全:什么是数据风险评估?等保合规为什么是企业必需品

作为一项保护措施,组织应定期执行数据风险评估,以审查和保护敏感信息。但什么是数据风险评估以及执行数据风险评估的优秀方法是什么?等保合规为什么是企业必需品 数据风险评估是我国《数据安全法》明确要求的内容,我们知道在传统的…

linux使用docker 安装mysql redis

linux安装docker https://hub-stage.docker.com/ 前往这里搜索容器来部署。每个容器都有独立的运行环境。 具体安装教程 https://docs.docker.com/engine/install/centos/#install-using-the-repository 检查是否安装成功: sudo docker --version 配置国内镜像加速…

【零基础入门TypeScript】环境

目录 定义环境 句法 例子 环境声明是告诉 TypeScript 编译器实际源代码存在于其他地方的一种方式。当您使用大量第三方js库(如 jquery/angularjs/nodejs)时,您无法在 TypeScript 中重写它。对于 TypeScript 程序员来说,在使用这…

18.AVL树的模拟实现

前面对map/multimap/set/multiset进行了简单的介绍,在其文档介绍中发现,这几个容器有个共同点是:其底层都是按照二叉搜索树来实现的,但是二叉搜索树有其自身的缺陷,假如往树中插入的元素有序或者接近有序,二…

阳光能源,创造永远:光模块的未来”:随着大数据、区块链、云计算和5G的发展,光模块成为满足不断增长的数据流量需求的关键技术

光模块的类型介绍: 为了适应不同的应用需求,不同参数和功能的光模块应运而生。光模块的分类方式及类型详见如下: 🔎封装形式🔍: 📣📢光模块按照封装形式来分有以下几种常见类型&a…