一文梳理vs2017中lib的使用

Windows下有靜態鏈接庫(lib)和動態鏈接庫(dll)兩種共享代碼的方式。

本文將介紹lib的應用場景,以及在vs2017平臺下的生成和使用。


[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項目

lib新建項目
Ps:vs2017新建lib項目會默認創建預編譯頭,如果不使用預編譯頭,則進行如下設置並刪除相關文件即可:lib不使用預編譯頭

2. 實現一個lib函數

lib函數實現

3. 生成結果

lib生成結果

[How] 如何調用lib

新建一個控制檯應用,在其中調用上述生成的lib。

調用lib需要兩個文件:.h文件.lib文件

1. 項目配置

依次配置下列控制檯應用的項目屬性:

  • 附加包含目錄
    lib附加包含目錄

  • 附加庫目錄
    lib附加庫目錄

  • 附加依賴項
    lib附加依賴項

  • 調用結果如下:
    lib調用結果_項目配置

使用項目配置的方式調用lib庫比較繁瑣,還可能需要對debug版本和release版本作不同的配置。比較適合引用成熟的第三方庫,eg. protobuf, gurobi等。

2. 編譯語句

使用#pragma comment(lib, "../Debug/MyLIB.lib")語句調用lib。
lib調用結果_#pragma comment

#pragma comment語句將庫目錄直接寫進代碼,更加直觀;需要仔細將頭文件目錄和庫目錄寫對。

3. 直接引用

如果lib項目和控制檯項目在同一解決方案下,可以採用直接添加引用的方式。

  • 添加引用
    lib添加引用

  • 調用結果如下:
    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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章