繁体   English   中英

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

[英]link.exe, choosing 64-bit or 32-bit version of Kernel32.lib

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

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

有没有写绝对路径的方法吗?

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

最简单的方法是运行提供的批处理文件。 vcvarsall.bat是主要版本,将它与指定要使用的构建环境类型的单个参数一起使用。 使用64位工具链的x86用于32位), amd64用于64位)或使用32位工具链(用于32位交叉编译器上的64位)用于x86_amd64用于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文件。 使用批处理文件以最小的麻烦正确设置所有文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM