首页 > 解决方案 > 为什么 Visual Studio 中的 64 位项目仍使用 32 位静态库?

问题描述

我在VS2017中创建了一个Win32程序,转成x64 Release Configuration。我发现链接器中被评估的输入库%(AdditionalDependencies)仍然指向那些 32 位的库。

由于某些原因,64 位程序不能使用 32 位 DLL,我认为这与它不能使用 32 位 LIB 的原因相同。

为什么 Visual Studio 中的 64 位项目可以使用 32 位静态库?困惑并等待任何建议。

配置已更改,但依赖项未更改

标签: visual-studiox8664-bitstatic-librariesstatic-linking

解决方案


x86 和 x86-64 是两种不同的架构,具有不同的指令集。每个指令集就像一种不同的语言,因此这些架构上的二进制文件不能链接在一起,因为一个架构不理解另一个架构的“语言”。即使使用相同的指令集,也可能存在多个调用约定,这意味着有时如果它们使用不同的约定,则无法链接两个 32 位对象

动态库和静态库都是……库。它们必须在某个时间点(运行时或链接时)链接到已编译的对象。如上所述,在不同架构中链接二进制文件是不可能的,这就是为什么您需要 64 位库用于 64 位应用程序


编辑:

包含屏幕截图后,现在很明显您指的是系统库文件。在这种情况下只是名称没有改变,里面的内容实际上是64位的。所以64 位项目没有链接到 32 位代码

在 64 位 Windows 上 System32 是 64 位系统文件夹,而 32 位系统二进制文件存储在 SysWOW64 中。带有后缀的文件和文件夹32将包含 64 位代码

同样的事情适用于许多其他文件夹和注册表项,因为不幸的是,糟糕的程序员已经硬编码路径,如 System32、HKLM\SOFTWARE... 几十年来,MS 无法在不破坏旧代码的情况下重命名它们。因此,在 64 位 Windows 上运行的 32 位应用程序将放在文件系统重定向器下,以便它们可以使用相同的路径并以所需的位数获取正确的库


推荐阅读