gpt4 book ai didi

c++ - 尽管没有库依赖性,但编译 cryptopp 时 MT/MD 不匹配

转载 作者:行者123 更新时间:2023-11-30 01:49:47 26 4
gpt4 key购买 nike

我目前正在尝试在 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

在项目文件中,除了项目级别的设置外,我找不到任何其他 设置,因此我假设没有具有/MD 开关的 .cpp 文件。

总而言之,这意味着我的库定义了/MT,但 crytlib 内部使用的东西似乎定义了/MD。有没有办法找出那个开关定义了什么对象/cpp/define/library/whatever?

最佳答案

此链接器诊断是 100% 准确的提示,表明您实际上正在链接构建错误的 .obj 或 .lib 文件。几乎总是您不知道的 .lib 文件,因为您不必明确地将它们列为附加依赖项。 MSVC++ 使得指定链接依赖项变得非常容易,而无需使用设置,例如在源代码文件中使用添加引用或 #pragma comment(lib, "yadayada.lib")。当然非常方便,但当您尝试对此类链接器错误进行故障排除时并不那么明显。

它很容易诊断,但是,链接器有一个选项可以向您显示它实际链接的内容。使用 Project + Properties、Linker、Command Line 并添加 /VERBOSE 选项。链接器现在在“输出”窗口中变得非常健谈,向您显示它加载的每个 .lib 文件以及它从 .lib 文件中使用的符号。

.lib 名称应该足以提示您知道从哪里开始查找,您应该从那里知道#include。您是否可以真的使用/MT 构建仍然悬而未决,如果它是 DLL 的导入库,那么可能性会迅速降低。避免强制它,在一个进程中拥有多个 CRT 拷贝会带来很多麻烦。

关于c++ - 尽管没有库依赖性,但编译 cryptopp 时 MT/MD 不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28427500/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com