Linux下生成動態庫函數及呼叫簡述

2020-08-13 11:43:19

生成一般的動態庫函數

一般的庫函數指的是隻是單純的編譯的程式碼,比如自己利用標準標頭檔案編寫的c|cpp程式,for example:加減乘除函數

具體如下,以求和爲例,找到一個目錄開始操作,首先新建檔案

touch sum.cpp //儲存生成庫的原始碼
touch sum.h  //儲存生成庫的標頭檔案,標頭檔案內容如下
    #ifndef __SUM_H__
    #define __SUM_H__
    int sum(int x,int y);
    #endif
將sum.cpp和sum.h編譯成動態庫檔案,後綴爲.so
法1.gcc -fPIC -shared -o libsum.so sum.cpp
法2.gcc -c -fPIC sum.cpp
    gcc -shared -o libsum.so sum.o
touch test.cpp //儲存呼叫sum庫的主程式,內容如下
    include<iostream>
    include"sum.h"
    int main()
    {
        int x=1;
        int y=2;
        sum(x,y);//sum函數具體在sum.cpp中體現,可自由編寫
    }
生成可執行檔案.out,預設爲a.out,檔名可自由修改,下面 下麪用test.out爲例
gcc test.cpp -o test.out -L. -lsum   //生成test.out,其中-lxxx表示要鏈接libxxx.so,xxx表示庫的原始碼檔名
LD_LIBRARY_PATH=. ./test.out   //執行即可,LD_LIBRARY_PATH爲可執行檔案指明庫路徑

生成包含庫的動態庫函數

這裏使用opencv爲例,如果使用opencv的庫編寫一個程式,正好這個程式又要生成動態庫,那麼除了要找到新生成的動態庫路徑還要考慮到opencv的庫路徑,這就和上面的情況有所不同了。

opencv安裝好之後,一般是編譯在/usr/local/include下,假設opencv編譯完成,那麼和上面一樣找到一個路徑進行操作。

touch opencvtest.cpp  //生成庫的原始碼
touch opencvtest.h   //生成庫的標頭檔案
touch opencv_test.cpp//主程式
g++ -shared -fpic -o libopencvtest.so opencvtest.cpp `pkg-config --libs --cflags opencv`//生成.so動態庫
g++ -o opencv_test.out opencv_test.cpp ./libopencvtest.so `pkg-config --libs --cflags opencv`//生成opencv_test.out檔案
./opencv_test.out//執行

與上述不同的是在g++最後加上了一個`pkg-config --libs --cflags opencv`就是這個生成動態庫要連線上opencv的庫,否則生成.so時會報出找不到關於opencv的標頭檔案,既然是關於opencv的,那麼一定會涉及到讀取影象路徑,Linux與Windows的路徑格式還是有區別的,如果設定的都沒問題,程式還是不行,比如執行.out檔案時會報出如下錯誤,那就是路徑問題了。這個錯誤很容易出現在Windows下的程式移植到Linux下,因此,務必小心。

OpenCV Error: Bad argument (unrecognized or unsupported array type) in cvPtr2D, file /home/pi/opencv-2.4.9/modules/core/src/array.cpp, line 1830
terminate called after throwing an instance of 'cv::Exception'
what():  /home/pi/opencv-2.4.9/modules/core/src/array.cpp:1830: error: (-5) unrecognized or unsupported array type in function cvPtr2D

下面 下麪簡單列出兩種不同系統下的路徑格式,以絕對路徑爲例

Windows:C:\\****\\*****\\****,上下級資料夾用\\隔開

Linux:/usr/****/****/***,上下級資料夾用/隔開