2

这是一个 Windows 控制台应用程序(实际上是一个服务),它是一个以前的人在 4 年前构建并安装并运行的。我现在需要进行一些更改,但甚至无法构建当前版本!这是构建输出:

--------------------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,但我在“网络”上找不到任何东西。大概它被我链接到的某个库使用,但我不知道它在哪个库中。

--- 阿利斯泰尔。

4

4 回答 4

3

LNK4098 可能不是问题。例如,如果您链​​接到某个库的发布版本,该库使用静态运行时链接并导致将 LIBCMT(注意“D”后缀的缺失)添加到默认库,则可能会发生这种情况。您的应用程序在 Debug 配置中构建,使用 LIBCMT D,因此存在冲突。它实际上可能是安全的,前提是您没有与该库交换任何依赖于运行时的内容。

至于_socket_noblock.obj 和 .lib 文件,您可以使用一些搜索工具(例如 grep 或 find)来搜索此字符串。这样,您将知道哪个库引用了该符号,这可能是发现该库具有哪些依赖项的起点。

于 2008-12-01T11:08:35.337 回答
1

您可以使用“Dependency Walker” - 一个免费工具来查找应用程序的依赖项,以了解您的应用程序如何链接到 libcmtd。 编辑:当然,您不能在无法链接的新版本上使用它(请参阅评论),但您可以在旧版本或新版本链接的已知库上使用它。

然而,由于真正的问题与我的建议无关,也许这个问题应该被关闭。

看起来您正在链接到不同版本的 CRT - 可能是因为您正在使用旧的构建库以及新的编译器和 CRT 版本。

于 2008-12-01T11:00:14.307 回答
1

抱歉,这是内部问题。4 年前一个特立独行的编码员和一个生锈的一无所有(我!)现在的组合。

该代码不使用_socket_noblock,但它确实使用socket_noblock,我只需要链接到我们自己的库之一。

于 2008-12-01T11:05:30.460 回答
0

defaultlib "LIBCMTD" 与使用其他库发生冲突是一个警告,表明您的程序使用的运行时库版本与您的一个或多个库不同。在程序和库中使用相同的运行时,以使警告消失。

(项目设置)(c++选项卡)类别(代码生成)(使用运行时库)

于 2010-03-12T13:25:25.427 回答