libraw靜態庫與動態庫的生成

2021-10-12 08:04:30 字數 1819 閱讀 4195

直接執行對應的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 ...