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

时间:2008-12-01 10:48:38

标签: c++ windows vc6 linker-errors unresolved-external

这是一个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,但我在'网上找不到任何内容。据推测它被我链接到的某个库使用,但我不知道它在哪个库中。

--- Alistair。

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

抱歉,这是一个内部问题。 4年前一个特立独行的编码器和一个生锈的没有任何东西(我!)的组合现在。

代码不使用_socket_noblock,但 使用socket_noblock,我只需要链接到我们自己的库中。

答案 3 :(得分:0)

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

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