直接執行對應的qt檔案就可以得到對應的動態庫。注意只用執行libraw對應的子工程即可。
動態庫會生成對應的dll和lib檔案。
靜態庫在字尾名為win64.zip或者win32.zip的壓縮包裡面有。在lib資料夾下面。但是我使用後發現它自帶的靜態庫沒有生效。不知道是什麼原因。因此我使用vs2015對libraw這個子工程進行了編譯,生成靜態庫。即相應的lib檔案。
在libraw資料夾下面有乙個libraw_types.h函式,裡面有這樣一段定義。即定義libraw_buildlib巨集的時候會生成對應的匯出庫,即動態庫(dll檔案)。簡單來說就是會執行dlldef __declspec(dllexport)。
#ifdef libraw_win32_dlldefs
#ifdef libraw_nodll
#define dlldef
#else
#ifdef libraw_buildlib
#define dlldef __declspec(dllexport)
#else
#define dlldef __declspec(dllimport)
#endif
#endif
#else
#define dlldef
#endif
*動態庫,當使用libraw動態庫的時候,按照正常匯入即可使用;
*靜態庫,靜態庫在使用的時候需要注意匯入巨集
比如在qt工程中加入
defines+
=libraw_buildlib
或者defines+
=libraw_nodll
按照標準來說這裡應該引入
defines+
=libraw_nodll
這樣將導致生成乙個空的dlldef,還是最上面那個巨集裡面的邏輯。
#define dlldef
但是為什麼在自己的工程裡定義defines+=libraw_buildlib也可以呢,因為按照邏輯,當定義了
#ifdef libraw_buildlib
**將執行
#define dlldef __declspec(dllexport)
對於靜態庫的使用來說這是沒有影響的。當然對於靜態庫你也不應該有這東西。
重點來了重點來了重點來了
對於靜態庫一定不要引入
#define dlldef __declspec(dllimport)
簡單來說對於使用libraw靜態庫,你必須匯入乙個巨集,不然進執行__declspec(dllimport)。但是你是靜態庫,沒有dll,這將導致報錯。
動態庫的使用是比較常見的。libraw提供的源**如果執行在qt環境下也是預設生成動態庫。但如果是要生成靜態庫,就要注意在使用libraw靜態庫的時候需要在工程中宣告乙個巨集:defines+=libraw_nodll(另外乙個也可以,但是屬於劍走偏著)。核心就是要避免__declspec(dllimport)的執行,不然將導致使用靜態庫失敗。
第一篇部落格,總結不好,見諒。
靜態庫與動態庫
linux下靜態庫 a 的例子 mylib.h 位於include資料夾下 ifndef mylib h define mylib h int add int a,int b endif mylib.cpp 位於lib資料夾中 include mylib.h int add int a,int b ...
靜態庫與動態庫
庫本質上是一種可執行的二進位制 可以被作業系統載入 linux和windows的庫是不相容的 庫可以分為靜態塊和動態庫,二者的不同點在於 被載入的時刻不同。靜態庫 在程式編譯時會被連線到目標 中,程式執行時不再需要改靜態庫,體積較大,一般應用與移植過程中在宿主機上編譯的 靜態庫檔名的命名規範是以li...
靜態庫與動態庫
1.靜態庫 工程在呼叫靜態庫時,複製靜態庫,源 加長,不節省程式空間。字尾名.a 優點 程式設計後不需要再依賴庫 以空間換時間 建立靜態庫 gcc c 原始檔.c ar rcs rcu 靜態庫名 目標檔案1 目標檔案2 rc 靜態庫不存在,就建立該庫檔案 s 更新靜態庫 使用 gcc o file ...