我正在尝试在 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 位生成x86
,amd64
用于 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,它是binx64
子目录。 -
INCLUDE
到包含头文件的相应include
子目录(对于所有生成类型都是相同的)。 -
LIB
到包含链接器动态存根的相应lib
子目录。对于x86,这只是lib
.对于 amd64 和 x86_amd64,它是libx64
子目录。
你显然缺少的那个是最后一个。链接器未在正确的目录中查找 LIB 文件。它不会根据machine
开关自动执行此操作。它不知道您如何配置构建系统或在哪里安装 SDK 文件。使用批处理文件以最小的麻烦正确设置所有内容。