经过一个漫长的过程重命名项目后,我的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。
答案 0 :(得分:5)
LIBCMT是您所需要的/ MT,MSVCRT是您所需要的/ MD。您正在链接混合的.obj和.lib文件,一些用/ MT编译一些/ MD。那不好。
通常是导致问题的.lib文件。检查其构建设置并确保其/ M选项与DLL项目相同。
另外,请注意如果使用/ MT编译DLL,可能会遇到麻烦。当DLL返回指向客户端需要释放的对象的指针时,您将遇到重大问题。它不能,它不使用相同的内存分配器。
答案 1 :(得分:1)
LNK4098上的MSDN文章有一个非常有用的表:它会告诉您手动添加到“忽略特定库”列表的库,具体取决于您使用的CRT。在您的情况下,您应该忽略所有这些:
libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib
观察到报告的库也在此列表中。 KB154753 ... libraries that a program will link with when built by using Visual C++
中更详细地描述了该问题我对此的解释是,在某些情况下,自动选择链接代码的CRT库的算法会选择几个冲突的库。
答案 2 :(得分:0)
什么是发行版?如果您分配内存以访问DLL尝试释放(例如,它们将分配在不同的堆中),则将DLL设置为多线程调试可能会导致问题。尝试设置多线程调试DLL。
您的链接问题可能会出现,因为您链接的库需要多线程调试DLL,因此链接器会尝试链接两者并且您的链接失败...
答案 3 :(得分: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