link.exe,选择 64 位或 32 位版本的 Kernel32.lib



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

nasm -f win32 test.asm 

它已成功编译。但是当我尝试链接链接时.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 Kits8.1libwinv6.3umx64Kernel32.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 的位置作为路径变量添加到某个地方,或者我应该使用开关,但我找不到它。

有没有办法在不写绝对路径的情况下链接?

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

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

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

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

  2. INCLUDE到包含头文件的相应include子目录(对于所有生成类型都是相同的)。

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

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

最新更新