【发布时间】:2015-04-10 05:44:18
【问题描述】:
我目前正在尝试在 Windows 8.1 机器上使用 MS Visual Studio 2013 编译静态 64 位版本的 cryptopp(更准确地说是 cryptlib VS 项目)。由于它是静态发布版本,因此我将运行时库设置为多线程 (/MT)。
但是链接器会抛出以下几个错误:
error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MD_DynamicRelease' in adhoc.obj
在我在这里和谷歌上发现的大多数类似情况下,这是由一个库设置 /MT 和另一个库设置 /MD 引起的。这种情况的奇怪之处在于链接器不包含任何库(可能除了一些 Visual-Studio 内部的魔法)并且没有额外的包含目录。链接器命令行汇编为:
/OUT:"build\x64\static_release\cryptlib64.lib" /LTCG /MACHINE:X64 /NOLOGO
在项目文件中,除了项目级别的设置外,我找不到任何其他
总而言之,这意味着我的库定义了 /MT,但是 crytlib 内部使用的东西似乎定义了 /MD。有没有办法找出那个开关定义了什么对象/cpp/define/library/whatever?
【问题讨论】:
-
您可以非常安全地假设它确实链接了其他库。可能通过源代码中某处的#pragma 注释指示这样做。通常也是一个强烈的暗示,只有 /MD 才能工作。使用 /VERBOSE 链接器选项,您会看到库被加载和搜索。
-
确实有一些库包含的编译指示帮助我找出我犯了哪些预处理器定义错误。将您的评论作为答案,我会接受。
-
/LTCG也对事物进行了一些限制。过去我在使用 Crypto++ 时遇到过问题。我认为的解决方法是使用动态 C 运行时链接重新编译 Crypto++ 静态库。 (默认情况下,Crypto+ 静态库是使用静态 C 运行时链接构建的。因此使用/MT和/MD出现问题的原因。
标签: c++ visual-c++ visual-studio-2013 linker-errors crypto++