【发布时间】:2010-04-27 23:18:49
【问题描述】:
问题:
我正在尝试使用一个名为 DCMTK 的库,它使用了其他一些外部库(zlib、libtiff、libpng、libxml2、libiconv)。我已经从同一个网站下载了这些外部库(*.LIB 和 *.h 文件)。现在,当我编译 DCMTK 库时,我收到如下链接错误(793 错误):
Error 2 error LNK2005: __encode_pointer already defined in MSVCRTD.lib(MSVCR90D.dll) LIBCMTD.lib dcmmkdir
Error 3 error LNK2005: __decode_pointer already defined in MSVCRTD.lib(MSVCR90D.dll) LIBCMTD.lib dcmmkdir
Error 4 error LNK2005: __CrtSetCheckCount already defined in MSVCRTD.lib(MSVCR90D.dll) LIBCMTD.lib dcmmkdir
Error 5 error LNK2005: __invoke_watson already defined in MSVCRTD.lib(MSVCR90D.dll) LIBCMTD.lib dcmmkdir
Error 6 error LNK2005: __errno already defined in MSVCRTD.lib(MSVCR90D.dll) LIBCMTD.lib dcmmkdir
Error 7 error LNK2005: __configthreadlocale already defined in MSVCRTD.lib(MSVCR90D.dll) LIBCMTD.lib dcmmkdir
Error 8 error LNK2005: _exit already defined in MSVCRTD.lib(MSVCR90D.dll) LIBCMTD.lib dcmmkdir
文档:
这似乎是该库的一个常见错误,因此,他们确实有一个解决此问题的常见问题解答条目 (http://forum.dcmtk.org/viewtopic.php?t=35) 说:
- 问题是链接器试图组合不同的, Visual 的不兼容版本 将 C++ 运行时库整合为单个 二进制。
- 当您的项目和库的所有部分未完成时,就会发生这种情况 链接反对是用生成的 Visual 中相同的代码生成选项 C++。
不要使用 /NODEFAULTLIB 解决方法,因为奇怪的软件 崩溃可能会随之而来。解决问题!
DCMTK 默认使用“多线程”或“多线程”编译 Debug”代码生成选项( 后者用于调试模式)。
- 要么更改所有代码的项目设置以使用这些代码 生成选项,
- 或更改所有 DCMTK 模块的代码生成并重新编译。
- MFC 用户注意:DCMTK 应使用“多线程 DLL”或 “多线程 DLL 调试”设置如果 您想将库链接到 MFC 应用程序。
为其他人解决相同问题:
Huge Amount of Linker Issues with Release Build Only 说:
看来您的发布版本是 试图链接到 内置调试。你可能有一个 构建中损坏的依赖项,(或 你错过了重建的东西 如果您的项目是手动释放 通常是分段构建的)。
从技术上讲,你似乎是 连接不同的项目
C Run Time library设置,一 用“多线程”,另一个 使用“多线程调试”。调整 所有项目的设置 使用相同的味道 图书馆和问题应该消失
问题:
到目前为止,我一直认为名称修改是唯一可能导致链接失败的问题,如果它没有被标准化的话。刚才我知道还有其他的东西也会产生同样的效果。
“调试模式”(多线程调试)和“发布模式”(多线程)是怎么回事? 究竟在幕后发生了什么?为什么正是这个东西导致了链接错误?
我想知道是否有一种叫做“单线程调试”和“单线程”的东西会再次导致同样的事情。
文档谈到“代码生成选项”。有哪些代码生成选项?他们是什么?
文档特别警告我们不要使用 /NODEFAULTLIB 解决方法。 (例如 /NODEFAULTLIB :msvcrt )。为什么?我怎么会惹麻烦?它到底是什么?
- 请为 MFC 用户解释文档中的最后一点。因为我将在这个项目的后面使用 MFC。解释我们为什么要这样做?如果我不这样做会造成什么麻烦。
- 您还有什么想说的吗?我的意思是关于类似的错误。我对 Linker 及其问题非常感兴趣。因此,如果有任何类似的事情,您可以提及它们或至少一些关键字。
【问题讨论】:
标签: c++ c visual-c++ linker