日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

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

發(fā)布時(shí)間:2025/3/8 linux 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux下构建自己的C++共享库并配合pkg-config生成链接选项 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Linux下構(gòu)建自己的C++共享庫(kù)并配合pkg-config生成鏈接選項(xiàng)

本文將以C++鏈表的新建、打印操作為例構(gòu)建自己的共享庫(kù),并在實(shí)際調(diào)試代碼時(shí)嘗試使用。我們?cè)谧鰯?shù)據(jù)結(jié)構(gòu)題時(shí)經(jīng)常需要將鏈表打印出來(lái)看一下結(jié)果,但是并沒有一種庫(kù)函數(shù)可以讓我們直接調(diào)用來(lái)打印自己的基于ListNode的鏈表(LeetCode的題目通常是這樣的鏈表)。因此本文將以此為例,介紹怎樣構(gòu)建自己的動(dòng)態(tài)鏈接庫(kù),并通過(guò)pkg-config生成對(duì)應(yīng)的鏈接選項(xiàng)。

編譯生成共享庫(kù)并添加到環(huán)境變量

源文件編譯生成共享庫(kù)

我們的鏈表庫(kù)的源代碼LinkedList.cpp是這樣的,僅有兩個(gè)函數(shù)新建、打印做例子。其源文件和頭文件如下:

// 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);

我們先來(lái)編譯鏈接生成共享庫(kù):

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

由于我們的共享庫(kù)要在運(yùn)行時(shí)動(dòng)態(tài)鏈接,因此需要將它放到特定的目錄下,并將該目錄添加到環(huán)境變量LD_LIBRARY_PATH,否則會(huì)在運(yùn)行時(shí)報(bào)找不到庫(kù)的錯(cuò)誤。(關(guān)于動(dòng)態(tài)鏈接與加載,可參考:Linux下的ELF文件、鏈接、加載與庫(kù)(含大量圖文解析及例程))

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

頭文件dsutils.h也放在一個(gè)目錄下:

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

測(cè)試代碼編譯運(yùn)行

現(xiàn)在我們創(chuàng)建一個(gè)測(cè)試代碼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; }

其實(shí)我們現(xiàn)在就可以用了,只是需要比較復(fù)雜的鏈接選項(xiàng)。我們要這樣編譯(其選項(xiàng)具體含義可參考:gcc參數(shù) -i, -L, -l, -include):

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

就可以正常生成可執(zhí)行文件了,其運(yùn)行輸出為:

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

但問題時(shí),總不能每次都打這么一長(zhǎng)串編譯選項(xiàng),現(xiàn)在只有一個(gè)庫(kù)文件還好,如果大項(xiàng)目中庫(kù)文件項(xiàng)目多了,就記不住了。這時(shí)我們就需要pkg-config工具來(lái)幫助我們生成鏈接選項(xiàng)。

利用pkg-config生成編譯鏈接選項(xiàng)

安裝

如果還沒有安裝過(guò)pkg-config工具的讀者可以:

下載、解壓、安裝、驗(yàn)證一氣呵成:

# 下載 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 # 驗(yàn)證 pkg-config --version # 輸出:0.29.2 安裝成功

配置dsutils.pc

安裝完成后,我們需要配置pc文件,來(lái)告訴pkg-config如何幫我們生成鏈接選項(xiàng),即我們有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/下:

這時(shí),可以在命令行中測(cè)試一下:

pkg-config dsutils --libs --cflags

一切正常的話會(huì)輸出:

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

讀者可能已經(jīng)發(fā)現(xiàn)了,這就是上面那一串長(zhǎng)長(zhǎng)的編譯鏈接選項(xiàng)。這樣做的另一個(gè)好處是,如果我們有更多的dsutils,如libmbtree.so,可以直接在dsutils.pc中添加,來(lái)增加鏈接選項(xiàng),而不用去記那么多的庫(kù)。

測(cè)試

測(cè)試只要將上面的選項(xiàng)在編譯時(shí)添加上即可:

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

如果一切正常則會(huì)產(chǎn)生一個(gè)可執(zhí)行文件test,運(yùn)行它,我們將得到輸出:

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

如果過(guò)程中有報(bào)錯(cuò),請(qǐng)先參考Linux下編譯、鏈接、加載運(yùn)行C++ OpenCV的兩種方式及常見問題的解決。如問題還不能解決,歡迎留言討論。

總結(jié)

以上是生活随笔為你收集整理的Linux下构建自己的C++共享库并配合pkg-config生成链接选项的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。