2008-12-01 92 views
2

這是一個Windows控制檯應用程序(實際上是一項服務),前一個人是在4年前建立的並已安裝並運行。我現在需要進行一些更改,但無法構建當前版本!這裏是生成輸出:如何解決此VC++ 6.0鏈接器錯誤?

--------------------Configuration: MyApp - Win32 Debug-------------------- 
Compiling resources... 
Compiling... 
Main.cpp 
winsock.cpp 
Linking... 
LINK : warning LNK4098: defaultlib "LIBCMTD" conflicts with use of other libs; use /NODEFAULTLIB:library 
Main.obj : error LNK2001: unresolved external symbol _socket_dontblock 
Debug/MyApp.exe : fatal error LNK1120: 1 unresolved externals 
Error executing link.exe. 

MyApp.exe - 2 error(s), 1 warning(s) 
-------------------------------------------------------------------------- 

如果我使用/NODEFAULTLIB然後我得到錯誤的負荷。該代碼實際上並未使用_socket_noblock,但我無法在網絡上找到任何內容。據推測它是由我鏈接到的一些圖書館使用,但我不知道它在哪個圖書館。

--- Alistair。

回答

1

對不起,這原來是一個內部問題。現在,一個4年前的特立獨行的編碼員和一個生鏽的沒有任何東西(我!)的組合。

的代碼不使用_socket_noblock但它確實使用socket_noblock我只需要鏈接到我們自己的圖書館之一。

1

您可以使用"Dependency Walker" - 一個免費工具來查找應用程序的依賴關係,以確定應用程序如何鏈接到libcmtd。 編輯:當然,您不能在未能鏈接的新版本上使用它(請參閱註釋),但可以在舊版本或新版本鏈接的已知庫上使用它。

但是,由於真正的問題與我提出的任何事情都無關,所以應該關閉這個問題。

看起來您正在鏈接到不同版本的CRT - 可能是因爲您正在使用舊的構建庫以及新的編譯器和CRT版本。

+0

呃......你怎麼在這無法鏈接一個應用程序中使用的Dependency Walker? – atzz 2008-12-01 11:09:48

3

LNK4098可能不成問題。例如,如果您鏈​​接某個使用靜態運行時鏈接的庫的版本並導致LIBCMT(注意「D」後綴缺失)被添加到默認庫,則會發生這種情況。您的應用程序正在構建在Debug配置中,使用LIBCMT D,因此存在衝突。它可能實際上是安全的,只要你沒有與該庫交換任何依賴於運行時的依賴關係。

至於_socket_noblock,可以使用某些搜索實用程序(如grep或find)在.obj和.lib文件中搜索此字符串。這樣你就可以知道哪個庫引用了該符號,這可能是發現該庫具有哪些依賴關係的起點。

0

defaultlib「LIBCMTD」與其他庫的使用衝突是一個警告,指示您的程序使用與您的一個或多個庫不同版本的運行時庫。 在程序和庫中使用相同的運行時,使警告消失。

(項目設置) (C++標籤) 類(代碼生成) (使用運行時庫)