繁体   English   中英

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

[英]How to resolve this VC++ 6.0 linker error?

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

---阿利斯泰尔。

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

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

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

但是,由于真正的问题与我建议的内容无关,所以也许应该解决这个问题。

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

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

该代码不使用_socket_noblock使用socket_noblock ,我只是需要链接到我们自己的图书馆之一。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM