如何解决此VC++ 6.0链接器错误?

How to resolve this VC++ 6.0 linker error?

提问人:user41013 提问时间:12/1/2008 最后编辑:Grace Noteuser41013 更新时间:7/15/2010 访问量:1504

问:

这是一个 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

---阿利斯泰尔。

C Windows 视觉对象 - C++-6 链接器错误 未解决 - 外部

评论


答:

1赞 Joris Timmermans 12/1/2008 #1

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

然而,由于真正的问题与我建议的任何事情都无关,也许这个问题应该结束。

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

评论

0赞 atzz 12/1/2008
呃......如何在无法 LINK 的应用程序上使用 dependency walker?
0赞 Joris Timmermans 12/1/2008
1.在旧版本的应用程序上确实有效。2. 如有必要,在新版本的各个依赖项上。但你的观点是有道理的,我在写它时确实想到了新版本,这很愚蠢,因为它没有链接。
1赞 user41013 12/1/2008 #2

对不起,这原来是内部问题。4 年前特立独行的编码员和现在生锈的无所事事(我!

代码没有使用,但它确实使用,我只需要链接到我们自己的库之一。_socket_noblocksocket_noblock

3赞 atzz 12/1/2008 #3

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

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

0赞 EvilTeach 3/12/2010 #4

defaultlib “LIBCMTD” conflicts with use of other libs 是一个警告,表示您的程序使用的运行时库版本与一个或多个库不同。 在程序和库中使用相同的运行时,以使警告消失。

(项目设置) (C++ 选项卡) category(代码生成) (使用运行时库)