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.pswp.cn/news/532719.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532719.shtml
英文地址,請注明出處:http://en.pswp.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;瓦礫…