Linux下C++打包so文件以及使用(Socket項(xiàng)目示例)

簡(jiǎn)介

  • Linux環(huán)境下c++代碼打包成so
  • Linux環(huán)境下so庫的使用

這里還是使用我們之前的Socket示例的代碼:

content.png

socketLib項(xiàng)目打包so文件

這里我們主要看Makefile文件

libmysocket.so : XTcp.cpp XThread.h XTcp.h
    g++  -fPIC -shared -lpthread  -o $@  $+ -std=c++0x

.PHONY : clean
clean :
    -rm  libmysocket.so
  • -fPIC參數(shù)
  • -shared參數(shù)
    執(zhí)行make后會(huì)在當(dāng)前目錄下生成libmysocket.so。so文件的命名規(guī)則是lib+定義的文件名+.so。

sockUseLib 項(xiàng)目如何使用so

先說明兩個(gè)項(xiàng)目都在/code目錄下。我們還是重點(diǎn)看Makefile文件

main : main.cpp
    g++ -I/code/socketLib -L/code/socketLib -lmysocket   -o $@  $+

.PHONY : clean
clean :
    -rm  main

這里重點(diǎn)在與-I-L參數(shù)。在前面gcc編譯參數(shù)中我們講到-I指的是頭文件的搜索目錄,-L是動(dòng)態(tài)庫的搜索目錄。
這里我們就成功的進(jìn)行了編譯。
然后運(yùn)行./main發(fā)現(xiàn)報(bào)錯(cuò)

./main: error while loading shared libraries: libmysocket.so: cannot open shared object file: No such file or directory

這句話的意思是找不到libmysocket.so這個(gè)動(dòng)態(tài)庫文件。雖然我們鏈接成功了。但是運(yùn)行時(shí)候找不到動(dòng)態(tài)庫。這里有幾個(gè)方法:

  • 臨時(shí)修改環(huán)境變量
    只對(duì)當(dāng)前的shell有效
    export LD_LIBRARY_PATH=/code/socketLib

關(guān)于LD_LIBRARY_PATH可參考Linux環(huán)境變量

  • 修改用戶環(huán)境變量
    只對(duì)當(dāng)前用戶有效
    export LD_LIBRARY_PATH=/code/socketLib添加到~/.bashrc的末尾。然后source ~/.bashrc
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容