Linux下构建自己的C++共享库并配合pkg-config生成链接选项

Linux下构建自己的C++共享库并配合pkg-config生成链接选项

本文将以C++链表的新建、打印操作为例构建自己的共享库,并在实际调试代码时尝试使用。我们在做数据结构题时经常需要将链表打印出来看一下结果,但是并没有一种库函数可以让我们直接调用来打印自己的基于ListNode的链表(LeetCode的题目通常是这样的链表)。因此本文将以此为例,介绍怎样构建自己的动态链接库,并通过pkg-config生成对应的链接选项。

编译生成共享库并添加到环境变量

源文件编译生成共享库

我们的链表库的源代码LinkedList.cpp是这样的,仅有两个函数新建、打印做例子。其源文件和头文件如下:

// LinkedList.cpp
#include <iostream>
#include <vector>using namespace std;struct ListNode{int val;ListNode* next;ListNode(int x) : val(x), next(NULL) {}
};ListNode* createList(const vector<int> vec){ListNode* head = new ListNode(0);ListNode* prev = head;for (int i : vec){ListNode* next = new ListNode(i);head->next = next;head = next;}return prev->next;
}void printList(ListNode* head){ListNode* p = head;while(p){cout << p->val << " -> ";p = p->next;}cout << "nullptr" << endl;
}// dsutils.h
#include <iostream>
#include <vector>
using namespace std;struct ListNode;
ListNode* createList(const vector<int> vec);
void printList(ListNode* head);

我们先来编译链接生成共享库:

g++ -shared -fpic LinkedList.cpp -o libmlist.so

由于我们的共享库要在运行时动态链接,因此需要将它放到特定的目录下,并将该目录添加到环境变量LD_LIBRARY_PATH,否则会在运行时报找不到库的错误。(关于动态链接与加载,可参考:Linux下的ELF文件、链接、加载与库(含大量图文解析及例程))

mkdir /home/song/mlib 
cp libmlist.so /home/song/mlib
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/song/mlib

头文件dsutils.h也放在一个目录下:

mkdir /home/song/minclude
cp dsutils /home/song/minclude

测试代码编译运行

现在我们创建一个测试代码test.cpp

// test.cpp
#include <iostream>
#include <vector>#include "dsutils.h"using namespace std;int main(int argc, char* argv[]){vector<int> vec = {1, 2, 3, 4, 5};ListNode* head = createList(vec);printList(head);return 0;
}

其实我们现在就可以用了,只是需要比较复杂的链接选项。我们要这样编译(其选项具体含义可参考:gcc参数 -i, -L, -l, -include):

g++ test.cpp -I/home/song/minclude -L/home/song/mlib -lmlist -o test

就可以正常生成可执行文件了,其运行输出为:

$ ./test
1 -> 2 -> 3 -> 4 -> 5 -> nullptr

但问题时,总不能每次都打这么一长串编译选项,现在只有一个库文件还好,如果大项目中库文件项目多了,就记不住了。这时我们就需要pkg-config工具来帮助我们生成链接选项。

利用pkg-config生成编译链接选项

安装

如果还没有安装过pkg-config工具的读者可以:

下载、解压、安装、验证一气呵成:

# 下载
wget https://pkg-config.freedesktop.org/releases/pkg-config-0.29.2.tar.gz
# 解压
tar -zxvf pkg-config-0.29.2.tar.gz 
# 安装
cd pkg-config-0.29.2/
./configure 
make
make check
sudo make install
# 验证
pkg-config --version
# 输出:0.29.2 安装成功

配置dsutils.pc

安装完成后,我们需要配置pc文件,来告诉pkg-config如何帮我们生成链接选项,即我们有dsutils.pc

lib_dir=/home/song/mlib
include_dir=/home/song/mincludeName: dsutils
Description: My utils of data structure.
Version: 0.1
Cflags: -I${include_dir}
Libs: -L${lib_dir} -lmlist

将配置好的dsutils.pc放到pkg-config的目录/usr/local/lib/pkgconfig/下:

这时,可以在命令行中测试一下:

pkg-config dsutils --libs --cflags

一切正常的话会输出:

-I/home/song/minclude -L/home/song/mlib -lmlist

读者可能已经发现了,这就是上面那一串长长的编译链接选项。这样做的另一个好处是,如果我们有更多的dsutils,如libmbtree.so,可以直接在dsutils.pc中添加,来增加链接选项,而不用去记那么多的库。

测试

测试只要将上面的选项在编译时添加上即可:

g++ test.cpp -o test `pkg-config dsutils --libs --cflags`

如果一切正常则会产生一个可执行文件test,运行它,我们将得到输出:

1 -> 2 -> 3 -> 4 -> 5 -> nullptr

如果过程中有报错,请先参考Linux下编译、链接、加载运行C++ OpenCV的两种方式及常见问题的解决。如问题还不能解决,欢迎留言讨论。

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

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

相关文章

webkitlineclamp css3,-webkit-line-clamp

无标题文档static&#xff1a;对象遵循常规流。top&#xff0c;right&#xff0c;bottom&#xff0c;left等属性不会被应用。 relative&#xff1a; 对象遵循常规流&#xff0c;并且参照自身在常规流中的位置通过top&#xff0c;right&#xff0c;bottom&#xff0c;left属性进…

Linux内核初探

Linux内核初探 内核的组成部分 kernel&#xff1a;内核核心文件&#xff0c;一般为bzp_w_picpath&#xff0c;经过压缩处理的镜像文件&#xff1b;通常内核核心文件保存在/boot/目录下&#xff0c;名称为vmlinuz-version-release kernel object(ko)&#xff1a;内核对象&…

Nplayer本地文件拷到服务器,手把手教你简易NAS构建,手机/平板/智能电视随意调取,家庭存储云共享,有了自己的网络云盘后再也不用担心容量不够了!...

之前嫌键盘侠烦&#xff0c;写这些也没意义所以把账号注销了文章删除了&#xff0c;现在想了想我抗吧12级老蛆还喷不过这帮小兔崽子&#xff1f;换了skt.ruo秽土转生&#xff0c;求喷子和我在各评论对线。特别是匿名dog见一个怼死一个。下面是之前号写的内容原文 -#简介NAS全称…

gdb 入门

gdb 入门 简介 gdb是GNU开源组织发布的一个强大的Linux下的程序调试工具。 一般来说&#xff0c;GDB主要帮助你完成下面四个方面的功能&#xff1a; 1、启动你的程序&#xff0c;可以按照你的自定义的要求随心所欲的运行程序。 2、可让被调试的程序在你所指定的调置的断点…

视频监控系统中的平台服务器,【视频监控主机 网络视频集中管理平台服务器】 - 太平洋安防网...

完善的管理功能管理系统内所有设备的接入及设备权限。设备状态监视。系统资源及用户权限分配及系统抢权管理。电子地图。实现系统内视频流的管理和转发控制。可通过WEB远程管理。强大的报警事件管理功能系统具备完善的报警及处理功能&#xff0c;能根据预先编写事件 处理预案对…

Linux下的CUDA多版本管理

Linux下的CUDA多版本管理 关于CUDA、cuDNN等的简介和安装可参考&#xff1a;显卡、显卡驱动、CUDA、CUDA Toolkit、cuDNN 梳理。 CUDA多版本 有时我们会在一台机器上同时看到多个版本的CUDA&#xff0c;比如nvcc -V和nvidia-smi的输出就可能会不同&#xff1a; 在我们实验室…

电脑显示无法连接sql服务器,他人的电脑为什么无法连接我电脑上的sql sever服务器...

如果SQL2005连接不上&#xff0c;并且服务器上所有与防火相关的东西都关闭了&#xff0c;还是连接不上。进行如下操作:一、为 SQL 启用远程连接1. 单击“开始”&#xff0c;依次指向“程序”、“Microsoft SQL Server 2005”和“配置工具”&#xff0c;然后单击“SQL Server 外…

ONNX初探

ONNX初探 转载自&#xff1a;https://blog.csdn.net/just_sort/article/details/112912272 0x0. 背景 最近看了一些ONNX的资料&#xff0c;一个最大的感受就是这些资料太凌乱了。大多数都是在介绍ONNX模型转换中碰到的坑点以及解决办法。很少有文章可以系统的介绍ONNX的背景…

服务器修改地址,服务器修改管理地址

服务器修改管理地址 内容精选换一换在弹性云服务器上安装完成后输入公网IP&#xff0c;无法连接目的虚拟机&#xff0c;端口无法访问工具。源端网络未连通目的端。目的端安全组未开放8084端口。目的端网络ACL禁用了8084端口。登录源端服务器后&#xff0c;在源端服务器中ping 目…

ONNX再探

ONNX再探 本文转自&#xff1a;https://blog.csdn.net/just_sort/article/details/113802330 这篇文章从多个角度探索了ONNX&#xff0c;从ONNX的导出到ONNX和Caffe的对比&#xff0c;以及使用ONNX遭遇的困难以及一些解决办法&#xff0c;另外还介绍了ONNXRuntime以及如何基于…

图像卷积及其计算(特征图尺寸、参数量、计算量)

图像卷积及其计算&#xff08;特征图尺寸、参数量、计算量&#xff09; 卷积前后特征图尺寸的计算 定义参数如下&#xff1a; 输入特征图尺寸&#xff1a; WWWWWW卷积核尺寸&#xff1a; FFFFFF步长&#xff1a; SSS填充的像素数&#xff1a;PPP 则有输出特征图尺寸为 NNNN…

图解自监督学习(CV)

图解自监督学习&#xff08;CV&#xff09; 译自&#xff1a;https://amitness.com/2020/02/illustrated-self-supervised-learning/ 作者&#xff1a;Amit Chaudhary 注&#xff1a;译者在某些地方对原文的表述做了调整&#xff0c;使其适合汉语的阅读习惯&#xff0c;并在…

机器学习中的归纳偏置

机器学习中的归纳偏置 带着偏见看世界&#xff0c;否则你根本没有看待世界的方式。 本文主要参考整理自知乎问题&#xff1a;如何理解Inductive bias&#xff1f; No-Free-Lunch&#xff08;NLF&#xff09;定理指出学习是不可能的&#xff0c;除非有先验知识。通常情况下&…

编译型与解释型、动态语言与静态语言、强类型语言与弱类型语言概念辨析

编译型与解释型、动态语言与静态语言、强类型语言与弱类型语言概念辨析 转自&#xff1a;https://blog.csdn.net/u010533843/article/details/76215487 编译型和解释型 我们先看看编译型&#xff0c;其实它和汇编语言是一样的&#xff1a;也是有一个负责翻译的程序来对我们的…

Linux环境变量详解

Linux环境变量详解 环境变量是操作系统环境设置的变量&#xff0c;适用于整个系统的用户进程。 环境变量分类 按照权限分类 系统级&#xff1a;系统级的环境变量是每个登录到系统的用户都要读取的系统变量用户级&#xff1a;用户级的环境变量则是该用户使用系统时加载的环境…

[分布式训练] 单机多卡的正确打开方式:PyTorch

[分布式训练] 单机多卡的正确打开方式&#xff1a;PyTorch 转自&#xff1a;https://fyubang.com/2019/07/23/distributed-training3/ PyTorch的数据并行相对于TensorFlow而言&#xff0c;要简单的多&#xff0c;主要分成两个API&#xff1a; DataParallel&#xff08;DP&am…

上学期C语言复习

C语言&#xff1a;面向过程例&#xff1a;完成两个单元内容的交换 &#xff1a; #include<stdio.h> //定义一个完成两个数据交换的函数 //void swap(int m,int n) void swap(int*m,int* n) { int temp;//临时单元 temp*m; *m*n; *ntemp; } int main() {int a5,b10; print…

[分布式训练] 单机多卡的正确打开方式:Horovod

[分布式训练] 单机多卡的正确打开方式&#xff1a;Horovod 转自&#xff1a;https://fyubang.com/2019/07/26/distributed-training4/ 讲完了单机多卡的分布式训练的理论、TensorFlow和PyTorch分别的实现后&#xff0c;今天瓦砾讲一个强大的第三方插件&#xff1a;Horovod。 …

【c语言数据结构笔记】1.2 数据结构

1.2数据结构 数据元素并独立 结构实体关系 形式定义&#xff08;D&#xff0c;S&#xff09; 其中D是数据元素的有限集&#xff0c;S是D上关系的有限集 eg&#xff1a;12位数&#xff1a;132423451233 分成三组四位数 次序关系<a1,a2><a2,a3> 遵守次序关系 eg&…

使用Apex进行混合精度训练

使用Apex进行混合精度训练 转自&#xff1a;https://fyubang.com/2019/08/26/fp16/ 你想获得双倍训练速度的快感吗&#xff1f; 你想让你的显存空间瞬间翻倍吗&#xff1f; 如果我告诉你只需要三行代码即可实现&#xff0c;你信不&#xff1f; 在这篇博客里&#xff0c;瓦砾…