2

经过漫长的重命名项目后,我的 DLL 项目将不会在调试模式下构建(发布构建工作):

MSVCRTD.lib(msvcr90d.dll) : error LNK2005: _CrtDbgReportW already defined in LIBCMTD.lib(dbgrpt.obj)

该项目及其所依赖的五个静态库被设置为使用“多线程调试 (/MTd)”(在 C/C++|代码生成|运行时库下)。我相信 LIBCMTD.lib 是用于多线程调试的,但什么是 MSVCRTD.lib,什么可能导致此错误?

如果它有所作为,这个 DLL 是用于 Windows CE 的。

4

4 回答 4

5

LIBCMT 是 /MT 所需要的,MSVCRT 是 /MD 所需要的。您正在链接混合的 .obj 和 .lib 文件,有些是用 /MT 编译的,有些是用 /MD 编译的。这不好。

通常是 .lib 文件导致问题。查看他们的构建设置并确保他们的 /M 选项与您的 DLL 项目相同。

此外,请注意如果 DLL 是使用 /MT 编译的,您可能会遇到麻烦。当 DLL 返回指向客户端需要释放的对象的指针时,您将遇到重大问题。它不能,它不使用相同的内存分配器。

于 2010-01-18T19:30:47.363 回答
1

LNK4098上的 MSDN 文章有一个非常有用的表:它告诉您要手动将哪些库添加到“忽略特定库”列表中,具体取决于您使用的 CRT。在您的情况下,您应该忽略所有这些:

libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib

请注意,报告的库也在此列表中。该问题在KB154753 中有更详细的描述...当使用 Visual C++ 构建程序时将链接的库

我对此的解释是,在某些情况下,自动选择哪些 CRT 库来链接你的代码的算法会选择几个冲突的库。

于 2010-02-09T00:48:06.403 回答
0

什么是发布集?如果您分配访问 DLL 的东西试图释放的内存(例如,它们将被分配到不同的堆中),将 DLL 设置为多线程调试可能会导致问题。尝试设置多线程调试 DLL。

您的链接问题可能会出现,因为您要链接到的库需要多线程调试 DLL,因此链接器尝试链接两者并且您的链接失败......

于 2010-01-18T19:31:08.107 回答
0

问题是 msvcr90d.dll 不在 windows ce 映像中。它必须与应用程序一起部署。msvcr90d.dll 位于 $(VCInstallDir)/ce/bin/$(ARCHFAM)。

http://stackoverflow.com/questions/15959877/windows-ce-6-0-and-runtime-link-to-debug-dll-mdd

于 2013-04-12T10:35:32.843 回答