以下總結(jié)只針對windows平臺:
- dll文件應有static 和 dynamic的版本,編譯時臨時文件的目錄分別是: Debug, Release, DebugDll, ReleaseDll。
- 一般推薦使用dll的static版本,因為這樣就不用指定dll文件所在的路徑,以后對文件大小或其它要求時再換成dynamic版本的;但中間要注意的是:如果static版本文件有所改變,依賴其的項目要手動重新編譯,不然使用的還是老版本的static 庫。
- dll文件命名為: XxD.lib(Debug), Xx.lib(Release), XxD_dll.lib(Debug Dynamic), Xx_dll.lib(Release Dynamic), 如果是Unicode版本,在相應的'.'或'D'字符前加U,如:XxUD.lib(Debug Unicode), XxU.lib(Release Unicode)。
- 作為第三方API時,應提供完整的include, lib, bin目錄,readme.txt文件,可選擇提供example, doc目錄。 其中:include文件夾中放依賴的頭文件;lib中放所有的*.lib文件;bin中放所有的*.dll文件。
- 作為第三方API時,最好是通過def的方式生成,這樣可以跨語言使用。如果只限于c++調(diào)用,并且要導出的類比較多,則可以折中考慮使用dllexport的方式。
以下總結(jié)是以前在Linux平臺:(Eclipse+CDT)
- 如何新建庫項目: 先新建一空項目,再修改設置:項目Property頁--->C/C++ Buildings--->Settings--->Build Artifact--->Artifact Type中選擇庫類型。
- 靜態(tài)庫使用:
- 設置include頭文件目錄:.I./../XxLib/include;
- 設置Linker庫文件目錄: -L./../XxLib/lib;
- 設置Linker庫文件: -lXxLib
- 動態(tài)庫使用:
- 隱式調(diào)用同上面的靜態(tài)庫;
- 顯式調(diào)用在Linker中: -ldl -lXxLib;
- 如果動態(tài)庫不是放在/lib,/usr/lib目錄下,需設置環(huán)境變量:LD_LIBRARY_PATH=./../XLib/lib
- 當同時存在該庫的靜態(tài)版本和共享版本時,鏈接器優(yōu)先使用共享版本Xx.so,此時你可以使用-static鏈接選項指定鏈接靜態(tài)版本Xx.a
- 動態(tài)庫可以導出兩個特殊的函數(shù):_init和_fini,前者在動態(tài)庫被加載后調(diào)用,后者在動態(tài)庫被卸載前調(diào)用,我們可以使用這兩個函數(shù)做些特別的工作。需要注意的是:在定義這兩個函數(shù)后編譯時,需要使用-nostartfiles選項,否則編譯器報重復定義錯誤。
- 應用程序與庫混合調(diào)試:項目Property頁--->C/C++ General--->Paths and Symbols--->References--->選擇引用庫。
- ldd用來查看程序所依賴的共享庫,同時也方便我們判斷共享庫是否被找到; nm命令查看obj文件(.so也是一個obj)中的標識(函數(shù)、變量)。
Q:在Linux的DLL中如何使用stdcall調(diào)用方式