生成一般的動態庫函式
一般的庫函式指的是只是單純的編譯的**,比如自己利用標準標頭檔案編寫的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庫的主程式,內容如下
includeinclude"sum.h"
int main()
生成可執行檔案.out,預設為a.out,檔名可自由修改,下面用test.out為例
gcc test.cpp -o test.out -l. -lsum //生成test.out,其中-l***表示要鏈結lib***.so,***表示庫的原始碼檔名
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/****/****/***,上下級資料夾用/隔開
Linux下生成動態庫和靜態庫
最近搞linux的程式設計 寫寫這個 綜合網上例子和本人使用方法。編輯得到舉例的程式 hello.h hello.c和main.c hello.h 見程式1 為該函式庫的標頭檔案。hello.c 見程式2 是函式庫的源程式,其中包含公用函式hello,該函式將在螢幕上輸出 hello main.c ...
linux 下生成動態庫 so並引用
動態庫的引入及減少了主 檔案的大小,同時生成的動態庫又是動態載入的,只有執行的時候才去載入,linux 下的 動態庫 so 就像windows下的 dll一樣。有關動態庫的概念自行上網搜。一下是建立及引用動態庫 test so.h ifndef test so h define test so h ...
LInux下生成靜態庫和動態庫
靜態庫與動態庫生成例項 linux下庫 編譯引數分析 靜態庫動態庫 在編譯過程中已經被載入可執行程式,所以體積較大 在可執行程式執行時才載入記憶體,在編譯過程中只是簡單的引用,所以 體積較小 準備好測試工作,寫好測試 test.h test.c main.c ifndef test h define...