1. 程式人生 > >linux 程式碼封裝成靜態庫和動態庫使用(待續)

linux 程式碼封裝成靜態庫和動態庫使用(待續)

問題是這樣的,自己的程式碼實現了一個數據分類的功能,如何把這部分程式碼完全打包成動態庫和標頭檔案,提供API給別人呼叫呢?

如果沒有使用其它的依賴庫或者其它開原始碼,那麼可以直接按照gcc編譯器生成和使用靜態/動態庫的方式。可以參考部落格:

按照這篇部落格裡面的操作,基本可以完成自己生成靜態庫和動態庫,提供庫和標頭檔案,即可以API的方式提供給別人呼叫了。

但是如果使用其它的開原始碼,有太多的依賴,應該怎麼辦呢?(這裡的問題是這樣子的,使用caffe實現了分類的演算法,想把這部分完全打包提供給其他人使用,那麼其他人只需要看見我提供給他的.h介面檔案,以及相應的所有so庫就行。)

具體流程如下,首先需要編譯caffe,得到在build/lib/libcaffe.so.xxx的檔案,將該檔案和需要提供給其他人使用的.h檔案提取出來。

寫main函式main.cpp

#include “xxx.h”

 

void main(){

                xxxx;

}

再利用gcc編譯,使用如下命令 g++ -o output main.cpp -L ./lib –lcaffe (細節可以參考前面的部落格)

編譯會報錯,提示很多的檔案找不到,是因為缺少對應的so庫。

想辦法把所有依賴的so庫提取出來,編譯的時候,把所有需要的so庫全部加上(但是這裡如何找到所有需要的so庫呢?我這裡採用的方式先編譯出一個可執行檔案,然後執行該檔案時就會提示缺少哪個檔案,我一共找了90多個,比較不智慧)

比如:

g++ -o sayheke main.cpp -L ./lib -lcaffe -latk-1.0-lgstbase-0.10 –lavcodec

但是有時候可能會和系統的一些庫重合,會報一些錯。再看下如何解決這個問題。

這裡碰到的問題是 /usr/lib/ld cannot find libxxx

這裡查了一下,我這裡需要的so庫在./lib裡面都是存在的,為什麼還會報這種錯誤呢?

實踐發現,問題應該跟so庫的連結有關,把所有提示cannot find的庫,全部.so後面的內容去掉。

比如 mv libxxx.so.x.x libxxx.so,改一下lib的名稱即可

這裡可以選擇把所有的lib庫檔案全都改名為xxx.so

再次編譯即可完成

這裡通過改名稱,全都改為xxx.so後,編譯的可以正常編譯了,但是卻碰到了執行時,再在這個庫裡面找的時候,卻是要找.so.xx.xx的檔案,我這裡選擇儲存兩個lib庫使用。但是感覺應該還是so庫的連結問題。

既提供.so,也提供.so.xx.xx的方式是可行的,但是其實更好的方式是,增加軟連結,將.so軟連結到.so.xx.xx上