簡體   English   中英

C ++:#pragma注釋(lib,“ XXX”)實際上對“ XXX”有什么作用?

[英]C++: What does #pragma comment(lib, “XXX”) actually do with “XXX”?

我的背景是C#,但我必須維護一些舊版(MS)C ++。 在該代碼庫中,我絆倒了:

#pragma comment(lib, "OtherLib700.lib")

其中700是一些版本。 除了lib以外,還有一個同名的DLL。

我首先認為該程序將依賴於DLL,但是從系統中刪除該程序后,該程序仍然可以運行。 但是,存在該DLL的較新版本,名為OtherLib900 ...

似乎該程序“包含”了lib的代碼,因此它不再依賴於外部DLL。 (或者該程序“自動”使用更新的DLL ...)

哪一個是正確的? 有沒有辦法進一步確認“假設”?

pragma用於鏈接到指定的.lib文件。 這是在項目設置的外部依賴項字段中指定庫的替代方法。

通常,它用於支持不同的版本:

#ifdef USE_FIRST_VERSION
#pragma comment(lib, "vers1.lib")
#else
#pragma comment(lib, "vers2.lib")
#endif

當您的應用程序使用動態鏈接的庫時, lib文件會告訴您有關dll中導出了哪些符號的信息。 因此,基本上,您只需要lib進行編譯和鏈接,但是您需要dll來運行程序,因為它包含所有二進制代碼。

您說有一個關聯的dll ,它通常表示lib文件僅包含鏈接信息,而沒有代碼。 如果找不到關聯的dll ,您應該會遇到運行時錯誤。 您可以使用MSVS檢查是否加載了其他版本的dll ,或者是否從其他位置加載了它。

如果程序具有此編譯指示,它將尋找庫OtherLib700.lib 如果在導入程序時這是導入庫,則Windows將在路徑中搜索OtherLib700.dll 它不會在執行過程中嘗試查找OtherLib900.dll ,因此它必須在其他文件夾中找到您的dll 這假定OtherLib700.lib是導入庫,而不是靜態庫。 如果OtherLib700.lib是靜態庫,則只需要它。

如果.lib是帶有實際代碼的“真實” lib(我從未用過DLL來保存系統提供的DLL,但我相信您為自己的DLL制作了“ import libs”),則該DLL不是需要。

對於主題,#pragma comment(lib,xxx)允許程序為鏈接器添加某些選項。 可能非常有用,盡管我錯過了一些想添加的選項。 給出的示例是其用法的主要示例:當目標文件包含在程序中時,還將同時添加指定的lib。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM