这是一个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但我无法找到关于“净投放任何东西。据推测,它是由一些图书馆,我链接,但我不知道它是什么库。

---阿利斯泰尔。

有帮助吗?

解决方案 2

对不起,此结果是一个内部的问题。 3年前一个特立独行的编码器的组合和生锈没有什么(我)了。

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

其他提示

LNK4098可能不会成为一个问题。例如,如果您对其中使用静态运行时联动,并导致LIBCMT一些库的发行版本链接可以出现它(请注意“d”后缀由于缺少)被添加到默认库。您的应用程序,正在兴建中的调试配置,使用LIBCMT的 d ,因此发生冲突。它实际上可能是安全的,前提是你没有任何交换运行时的依赖与该库。

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

您可以使用“的Dependency Walker” - 一个免费的工具来查找应用程序的依赖关系,以找出你的应用程序是如何链接到libcmtd。 修改:你不能,当然,使用上没有链接(见注释)的新版本,但你可以使用它的旧版本,或已知库的新版本的链接。

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

它看起来像你链接到不同版本的CRT的 - 因为你正在使用旧建库与CRT的新的编译器和版本一起可能

defaultlib“LIBCMTD”与其他使用林达冲突是用于说明你的程序使用不同版本的运行时库的警告,你的图书馆之一以上。 使用相同的运行时整个程序和库,使警告消失。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top