visual-studio - 为什么 Visual Studio 中的 64 位项目仍使用 32 位静态库?
问题描述
我在VS2017中创建了一个Win32程序,转成x64 Release Configuration。我发现链接器中被评估的输入库%(AdditionalDependencies)
仍然指向那些 32 位的库。
由于某些原因,64 位程序不能使用 32 位 DLL,我认为这与它不能使用 32 位 LIB 的原因相同。
为什么 Visual Studio 中的 64 位项目可以使用 32 位静态库?困惑并等待任何建议。
解决方案
x86 和 x86-64 是两种不同的架构,具有不同的指令集。每个指令集就像一种不同的语言,因此这些架构上的二进制文件不能链接在一起,因为一个架构不理解另一个架构的“语言”。即使使用相同的指令集,也可能存在多个调用约定,这意味着有时如果它们使用不同的约定,则无法链接两个 32 位对象
动态库和静态库都是……库。它们必须在某个时间点(运行时或链接时)链接到已编译的对象。如上所述,在不同架构中链接二进制文件是不可能的,这就是为什么您需要 64 位库用于 64 位应用程序
编辑:
包含屏幕截图后,现在很明显您指的是系统库文件。在这种情况下只是名称没有改变,里面的内容实际上是64位的。所以64 位项目没有链接到 32 位代码
在 64 位 Windows 上 System32 是 64 位系统文件夹,而 32 位系统二进制文件存储在 SysWOW64 中。带有后缀的文件和文件夹32
将包含 64 位代码
同样的事情适用于许多其他文件夹和注册表项,因为不幸的是,糟糕的程序员已经硬编码路径,如 System32、HKLM\SOFTWARE... 几十年来,MS 无法在不破坏旧代码的情况下重命名它们。因此,在 64 位 Windows 上运行的 32 位应用程序将放在文件系统重定向器下,以便它们可以使用相同的路径并以所需的位数获取正确的库
推荐阅读
- pandas - 错误:未大小对象的 len() - Wilconox 符号秩检验
- extract - 提取类元素
- python - 如何让scrapy spider从起始网址下载图片?
- r - 在带有 na 的列上使用 cor.test()
- php - 如何解决 WordPress 插件中的命名空间冲突?
- ssh - 为什么通过 SSH 和 libssh 执行命令时 $PATH 不同?
- linux - 如何在 Jenkins 管道/Linux 中使用以下命令
- json - 如何使用powershell从json中获取值
- algorithm - 这是线性算法还是常数算法,为什么?
- javascript - 不能在 Vuex 中分配突变