我正在尝试在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
是主版本,请使用一个参数指定您要使用的构建环境的类型。使用x86
32amd64
位工具链进行32位,64位构建,或者x86_amd64
使用32位工具链(32位交叉编译器上的64位)进行64位构建。另外,您也可以使用单独的批处理文件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文件。使用批处理文件以最小的麻烦正确设置所有文件。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句