Windows下有靜態鏈接庫(lib)和動態鏈接庫(dll)兩種共享代碼的方式。
本文將介紹lib的應用場景,以及在vs2017平臺下的生成和使用。
靜態鏈接庫lib
[What] lib是什麼
通常所說的lib是指靜態鏈接庫(Static Link Library),其中包含代碼實現,lib實際上是obj文件的集合(obj文件由cpp文件編譯生成),lib可以看作是一個殼子,obj文件集合打包生成lib的過程也稱爲"archive"。在應用程序生成過程中鏈接器將代碼鏈接到目標模塊(exe或dll)中,完成鏈接後lib文件也就沒有用了,程序發佈時無需提供lib文件。
還有另一種lib被稱作是dll的導入庫,裏面包含了函數所在的dll文件及其位置信息(即索引功能),而真正的代碼實現在dll文件中,它的作用是隱式鏈接dll,在完成鏈接後lib文件也沒有用了,程序發佈時也無需提供lib文件,但需要提供dll文件(詳見下一篇文章)。
[How] 如何生成lib
1. 新建一個lib項目
Ps:vs2017新建lib項目會默認創建預編譯頭,如果不使用預編譯頭,則進行如下設置並刪除相關文件即可:
2. 實現一個lib函數
3. 生成結果
[How] 如何調用lib
新建一個控制檯應用,在其中調用上述生成的lib。
調用lib需要兩個文件:.h文件 和 .lib文件。
1. 項目配置
依次配置下列控制檯應用的項目屬性:
-
附加包含目錄
-
附加庫目錄
-
附加依賴項
-
調用結果如下:
使用項目配置的方式調用lib庫比較繁瑣,還可能需要對debug版本和release版本作不同的配置。比較適合引用成熟的第三方庫,eg. protobuf, gurobi等。
2. 編譯語句
使用#pragma comment(lib, "../Debug/MyLIB.lib")
語句調用lib。
#pragma comment
語句將庫目錄直接寫進代碼,更加直觀;需要仔細將頭文件目錄和庫目錄寫對。
3. 直接引用
如果lib項目和控制檯項目在同一解決方案下,可以採用直接添加引用的方式。
-
添加引用
-
調用結果如下:
直接引用的方式最爲簡單,也避免了路徑寫錯的可能性,但它無法區分該lib庫是debug版本還是release版本。這種方法也等效於直接將lib文件拖到項目資源裏使用。
[Why] lib的優缺點
-
優點:單純使用lib編譯生成的應用程序僅有一個可執行文件exe,在運行時不需要掛載dll,方便管理,適用於應用程序一次性交付的場景。
-
缺點:lib中的代碼會拷貝到exe中,導致exe佔用空間較大;同時失去動態庫帶來的模塊化與更新的靈活性,每一次發版都需要發佈全新的應用程序替換舊版。
[Github] 代碼
項目實例均在vs2017上測試,並上傳至GitHub: https://github.com/lyandut/EXE_LIB_DLL
[Reference] 參考
https://www.cnblogs.com/alantu2018/p/8470976.html
https://www.cnblogs.com/TenosDoIt/p/3203137.html
https://blog.csdn.net/weixin_43118068/article/details/88760001
https://blog.csdn.net/xiaohuh421/article/details/7476485