【问题标题】:link.exe, choosing 64-bit or 32-bit version of Kernel32.liblink.exe,选择 64 位或 32 位版本的 Kernel32.lib
【发布时间】:2016-07-13 19:48:16
【问题描述】:

我正在尝试在 64 位 Windows 中编译和链接 32 位程序。 我用 nasm 编译了我的程序

nasm -f win32 test.asm 

编译成功。但是当我尝试与 link.exe 链接时

link /entry:start /subsystem:console test.obj Kernel32.lib 

link /machine:x86 /entry:start /subsystem:console test.obj Kernel32.lib

它给了我这个错误:

C:\Program Files (x86)\Windows Kits\8.1\lib\winv6.3\um\x64\Kernel32.lib : warnin
g LNK4272: library machine type 'x64' conflicts with target machine type 'X86'
test.exe : fatal error LNK1120: 3 unresolved externals

但是当我编写 32 位版本的 Kernel32.lib 的绝对路径时,它链接成功。我想我应该将 32 位 Kernel32.lib 的位置作为路径变量添加到某处,或者我应该使用开关但我找不到它。

有没有不写绝对路径的链接方式?

【问题讨论】:

  • 使用/libpath设置路径?
  • 是的,它可以工作,但我正在尝试将此信息永久提供给链接器。 (作为环境变量)。我的意思是链接器必须了解 .obj 文件是 32 位的,并且它必须查找 32 位版本的库。我不明白为什么这会发生在我的电脑上。 VS 和 Windows 与其他计算机相同,但它只发生在我身上。而且我确定我没有更改其他项目的链接器配置。(我还使用 dumpbin 检查了 .obj 文件头,它们是 32 位的。)
  • 请不要将解决方案编辑到问题中。您对已接受答案的评论是该评论唯一归属的地方。
  • 好吧,我重新编辑了。

标签: assembly linker


【解决方案1】:

您应该从已使用正确环境变量正确设置的命令提示符运行链接器(和其他 SDK 工具)。那你就不会有这个问题了。

最简单的方法是运行提供的批处理文件。 vcvarsall.bat 是主要的,将它与一个参数一起使用,指定您要使用的构建环境的类型。 x86 用于 32 位,amd64 用于使用 64 位工具链的 64 位构建,或 x86_amd64 用于使用 32 位工具链的 64 位构建(32 位交叉平台上的 64 位编译器)。或者,您可以使用单独的批处理文件,vcvars32.batvcvars64.batvcbarsx86_amd64.bat

您可以自己浏览这些文件并查看它们设置了哪些环境变量,但老实说,不值得花时间对它们所做的设置进行逆向工程。相关部分是将环境变量%WindowsSdkDir%设置到Windows SDK安装的根目录,然后使用它来设置:

  1. PATH 包含适当的 bin 子目录,其中包含工具,包括 link.exe。对于 x86 和 x86_amd64,这只是 bin。对于 amd64,它是 bin\x64 子目录。

  2. INCLUDE 到包含头文件的相应 include 子目录(所有构建类型都相同)。

  3. LIB 到包含链接器动态存根的相应 lib 子目录。对于 x86,这只是 lib。对于 amd64 和 x86_amd64,它是 lib\x64 子目录。

您显然缺少的是最后一个。链接器未在正确的目录中查找 LIB 文件。它不会根据machine 开关自动执行此操作。它不知道您是如何配置构建系统的,也不知道您在哪里安装了 SDK 文件。使用批处理文件轻松正确地进行所有设置。

【讨论】:

  • 抱歉回复晚了。正如你所说,我检查了所有环境变量及其在 vcvarxxx.bat 文件中的用法。它们对我来说似乎都是正确的。实际上他们都是正确的:)。错误是(我很惭愧地说这个)我使用的是 VC2015 x64 CP :)
猜你喜欢
  • 1970-01-01
  • 2011-04-09
  • 1970-01-01
  • 2021-07-08
  • 2018-05-29
  • 2012-10-26
  • 2020-10-28
  • 1970-01-01
  • 2015-01-18
相关资源
最近更新 更多