2012-08-30 21 views
16

我的背景是C#,但我必須維護一些遺留(MS)C++。在那個代碼庫中,我弄糟了:C++:#pragma comment(lib,「XXX」)對「XXX」實際做了什麼?

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

其中700是一些版本控制。除了lib是一個具有相同名稱的DLL。

我首先想到的是程序依賴於DLL,但在從系統中刪除它之後,程序仍然有效。有一個較新版本的DLL,雖然它被命名爲OtherLib900 ...

看起來好像程序'包含'lib的代碼,以便它不再依賴於外部DLL。 (或者程序'自動'使用較新的DLL ......)

哪一個是正確的?是否有辦法進一步確認'假設'?

+3

Downvoted接受錯誤的答案。 – rustyx

回答

3

如果一個程序有這個pragma,它會查找庫OtherLib700.lib。如果這是加載程序時的導入庫,則窗口將在路徑中搜索OtherLib700.dll。它不會嘗試在執行期間尋找OtherLib900.dll,所以它必須在另一個文件夾中找到您的dll。這假設OtherLib700.lib是一個導入庫,而不是一個靜態庫。如果OtherLib700是一個靜態庫,那麼這就是它所需要的。

+0

是的700通常會進行一些版本控制,但是窗口會查找完全匹配,而不會嘗試加載具有相同名稱的更高版本的庫。 – drescherjm

+0

我如何知道其他庫是一個導入庫還是靜態庫? 因此,如果它是靜態的,它的代碼被包含在'我的'程序中? – steglig

+1

我相信在下面的答案描述如何區分差異:http://stackoverflow.com/questions/6402586/know-if-lib-is-static-or-import – drescherjm

33

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,則應該會出現運行時錯誤。如果加載了不同版本的dll或者它是從不同的地方加載的,則可以使用MSVS進行檢查。

+0

*「你只需要lib來編譯和鏈接」* ..所以lib可以像頭文件(.h)的替代品? – Acidic

-2

如果.lib是一個具有實際代碼的「真實」庫(我從來沒有使用DLL保存系統提供的DLL,但我相信你會爲自己的DLL生成'import libs'),那麼DLL不是必需的。

至於主題,#pragma comment(lib,xxx)允許程序爲鏈接器添加某些選項。可以是非常有用的,雖然我錯過了一些我希望像這樣添加的選項。給出的例子是其使用的一個主要例子:當目標文件被包含在程序中時,指定的lib也將被添加。

+2

什麼是「真正的」庫? –

+0

我認爲他的意思是「靜態」庫。 – moala

相關問題