要將專案編譯為庫,使用cmake的add_library命令:
add_library([static | shared | module]
[exclude_from_all]
source1 source2 ... sourcen)
其中,引數static, shared, module指定生成庫是靜態庫、動態庫或module(具體參照cmake文件)。如果沒有指定生成static庫還是shared庫,則cmake根據變數build_shared_libs確定編譯型別。當build_shared_libs為true,編譯為動態庫;否則,編譯為靜態庫。
在構建動態庫時,生成兩個檔案:導入庫(.lib)和動態庫(.dll)。gcc和mingw預設情況下會匯出所有符號,但是vs預設情況下不匯出任何符號。如果dll沒有匯出任何符號,則vs就不會生成導入庫(這就是為什麼vs構建dll時只生成了.dll,沒有生成.lib的原因)。如果要匯出函式或型別,必須使用__declspec( dllexport )。
在vs平台構建dll庫時,cmake會新增如下預處理定義
mylibrary_exports
其中,mylibrary是目標的名字。在程式**中,需要使用這個定義,如
#if defined (_win32)
#if defined(mylibrary_exports)
#define mylib_export __declspec(dllexport)
#else
#define mylib_export __declspec(dllimport)
#endif /* mylibrary_exports */
#else /* defined (_win32) */
#define mylib_export
#endif
現在,對與想匯出的類或者函式,只需要進行如下宣告:
// 匯出整個類
class mylib_export foo
;// 匯出類的靜態函式
class foo
;
注:如果不想使用cmake預設的預定義符號mylibrary_exports,也可以自己定義符號。如需要定義預處理符號compiling_dll,方法如下:
set_target_properties(mylibrary properties define_symbol "compiling_dll")
C C 條件編譯靜態庫或動態庫
windows 下方法 1.方法一 vs工程中中直接新增 1.1在vs的屬性 常規 附加庫目錄,添上資料夾的路徑 例如 lib x64 1.2輸入的附加依賴項,新增上庫的名字,例如 dmapi.lib 1.3 對用到該庫的 進行,巨集包含,例如 ifdef log xy endif 1.4 當你在工...
編譯靜態庫編譯動態庫
編譯靜態庫 cr標誌告訴ar將object檔案封裝 archive 我們可以使用nm s 命令來檢視.a檔案的內容 ar cr libmyhello.a hello.o 或 cvr 編譯動態庫 gcc c fpic test1.c gcc c fpic test2.c fpic告訴gcc將源 編譯成...
Linux下將Tinyxml編譯為靜態庫
04 using namespace std 05 06 int main 07 建立test.xml檔案,內容如下 view sourceprint?01 02 03 周星星04 2005 06 07 白晶晶08 1809 10 編譯當前檔案,呼叫libtinyxml.a庫 root server...