2

观察这个接近的场景,即使它看起来和我之前的问题一样。我仍然没有得到答案。所以请不要报告为重复。

我有一个项目,它有 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

我怎样才能解决这个问题?

4

3 回答 3

5

您不能混合使用 C 运行时库。如果你有一个编译的库或对象 /MT(anything),你不能只用 /MD 链接。您需要与线程安全的 MSVCRT 链接。没有如果的和的或但是关于它的。您不能混合C 运行时。我一直认为最好使用 /MT,即使在不执行线程的程序中也是如此。

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

于 2009-06-01T15:03:35.410 回答
1

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

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

我记得我曾经在 /MTD 和 /MDd 上遇到过同样的问题,并且我遇到了非常相似的错误。

于 2009-06-01T15:06:30.550 回答
0

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

于 2010-02-09T00:52:39.493 回答