如何編譯為靜態庫或動態庫

2021-06-19 22:26:07 字數 1312 閱讀 1046

要將專案編譯為庫,使用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...