我有两台机器,一台运行 Vista Ultimate 32,另一台运行 XP SP3。两台机器都安装了相同的 VS2008 版本。
我在第一台机器 (vista) 上构建了 boost 1.50.0,随后构建了依赖于 boost 的 libtorrent 库。
我在一些 libtorrent 构建说明中看到 win 版本是在预处理器中指定的,所以我做了目前看来有意义的事情:
#define _WIN32_WINNT=0x0600 // being that the current OS is Vista
构建成功,我能够在那台机器上运行应用程序。但是,当我尝试在另一个 (XP) 上运行它时,它失败了,并显示如下消息:
Procedure entry point SetFileInformationByHandle could not be located in the dynamic link library KERNEL32.dll
现在,从逻辑上讲,我猜测这与不兼容的版本有关,并且当此变量存在不同的值时,可能会包含不同的 Windows header 。
要求:我想在 Vista 或 7 上构建它,并且仍然能够在 XP 上运行它。
问题:我是否需要这个指令,如果需要,值应该是多少?如果我遗漏了什么,我还应该指定什么?
最佳答案
尝试在 XP 上构建您的程序或将 _WIN32_WINNT
设置为 0x0501
(如您的评论所示)。 kernel32.dll
库根据 this report 向后二进制兼容,因此您可以使用该库的旧版本 (5.0) 构建您的程序,并使用新版本 (6.0) 运行它,而无需重新编译。由于添加了一堆符号(SetFileInformationByHandle
就是其中之一),反之亦然。
关于Windows 版本预处理器和为向后兼容而构建?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11882346/