经历一个漫长的过程来重命名项目之后,我的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。

有帮助吗?

解决方案

LIBCMT是你需要什么/ MT,MSVCRT是你需要什么/ MD。要链接的obj和混合:.lib文件,一些编译/ MT一些与/ MD。这是不好的。

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

此外,要注意的麻烦,你可以进入,如果DLL与/ MT编译的。您将有重大问题时,DLL返回指向客户端需要释放的对象。它不能,它不使用相同的内存分配器。

其他提示

LNK4098 MSDN文章有一个非常有用的表格:它会告诉你哪些库手动添加到“忽略特定库”名单,这取决于CRT你使用。在你的情况,你应该忽略所有这些:

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

观察所报告的库是在此列表中了。这个问题进行了更详细的 KB154753 ...库描述的程序将与时通过使用Visual内置链接C ++

我的这种解释是,在某些情况下,可自动挑选哪个CRT库的算法来链接代码与将挑选几个冲突库。

什么是上映吗?如果您分配内存的东西accesing的DLL试图释放(他们会在不同的堆分配,例如)设置一个DLL多线程调试可能会造成问题。尝试设置多线程调试DLL。

您的链接问题可能出现是因为要链接到一个库期待多线程调试DLL,以便链接器试图链接都和你的链接失败...

问题是msvcr90d.dll不是Windows CE的形象。它必须与应用程序部署。该msvcr90d.dll位于$(VCInstallDir)/ CE /斌/ $(ARCHFAM)。

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

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