我正在尝试在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的位置作为路径变量添加到某个地方,或者我应该使用开关但我找不到它。
有没有办法在没有写绝对路径的情况下进行链接?
答案 0 :(得分:2)
您应该从已使用正确的环境变量正确设置的命令提示符下运行链接器(和其他SDK工具)。那你就不会有这个问题了。
执行此操作的最简单方法是运行提供的批处理文件。 vcvarsall.bat
是主要的,使用一个参数来指定您要使用的构建环境的类型。对于32位,x86
,对于使用64位工具链的64位构建,amd64
,或者对于使用32位工具链的64位构建,x86_amd64
(64位)在32位交叉编译器上)。或者,您可以使用单个批处理文件vcvars32.bat
,vcvars64.bat
和vcbarsx86_amd64.bat
。
您可以自己查看这些文件并查看它们设置的环境变量,但实际上不值得花时间反向设计它们的设置。相关部分是将环境变量%WindowsSdkDir%
设置为Windows SDK安装的根目录,然后使用它来设置:
PATH
包含相应的bin
子目录,其中包含工具,包括link.exe。对于x86和x86_amd64,这只是bin
。对于amd64,它是bin\x64
子目录。
INCLUDE
到包含头文件的相应include
子目录(对于所有构建类型都是一样的。)
LIB
到包含链接器动态存根的相应lib
子目录。对于x86,这只是lib
。对于amd64和x86_amd64,它是lib\x64
子目录。
你显然缺少的是最后一个。链接器没有在LIB文件的正确目录中查找。它不会根据machine
开关自动执行此操作。它不知道您如何配置构建系统或安装SDK文件的位置。使用批处理文件可以最大限度地正确设置它。