Visual C ++运行时库链接器问题

时间:2009-06-01 14:50:46

标签: visual-studio visual-c++ visual-studio-2005 linker msvcrt

观察此关闭场景,即使它看起来与我之前的问题相同。我仍然没有得到答案。 所以请不要重复报告。

我有一个有10个依赖项的项目。首先,我使用主项目中C / C ++代码生成部分中的/ MTD选项进行编译,并且所有依赖项都已成功构建。

接下来,我将选项从/ MTD更改为/ MDd,并且所有相关项目再次获得 建立成功。但是对于主项目,报告了以下错误:


LIBCMTD.lib(osfinfo.obj) : error LNK2005: __open_osfhandle already defined in MSVCRTD.lib(MSVCR80D.dll)

LIBCMTD.lib(lseeki64.obj) : error LNK2005: __lseeki64 already defined in MSVCRTD.lib(MSVCR80D.dll)


sqlite3x.lib(sqlite3x_command.obj) : error LNK2005: "protected: wchar_t * __thiscall std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >::_Myptr(void)" (?_Myptr@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IAEPA_WXZ) already defined in msvcprtd.lib(MSVCP80D.dll)

MSVCRTD.lib(MSVCR80D.dll) : error LNK2005: __mkdir already defined in LIBCMTD.lib(mkdir.obj)

MSVCRTD.lib(MSVCR80D.dll) : error LNK2005: __strdup already defined in
LIBCMTD.lib(strdup.obj)

   Creating library Debug/Application.lib and object Debug/Application.exp
LINK : warning LNK4098: defaultlib 'MSVCRTD' conflicts with use of other libs; use /NODEFAULTLIB:library

LINK : warning LNK4098: defaultlib 'LIBCMTD' conflicts with use of other libs; use /NODEFAULTLIB:library

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:5)

您不能混合使用C运行时库。如果你有一个库或对象编译/ MT(任何东西),你不能只与/ MD链接。您需要链接线程安全的MSVCRT。没有if和s或者是关于它的。你不能混合C运行时。即使在没有进行线程处理的程序中,我总是发现它最好只使用/ MT。

您是否运行了项目清理操作来删除已构建的对象和库?你在这里依赖SQLite,你也重建了吗?

答案 1 :(得分:1)

当一堆静态c ++库全部链接在一起时,它们都必须具有/ MTD或者它们都必须具有/ MDD。您无法将项目与/ MTD链接到具有/ MDd的另一个项目

这可能是导致链接错误的原因。您只在主项目上获得它的原因是您的主项目是唯一实际进行链接的项目。请告诉我们它是否解决了您的问题。

我记得我曾经遇到过与/ MTD和/ MDd相同的问题,我的错误非常相似。

答案 2 :(得分:0)

我的回答here可能会有所帮助,链接到我发现的一些MSDN文章,这些文章在解决我的问题版本时非常有用。