Windows 版本预处理器和为向后兼容而构建?

标签 windows boost version c-preprocessor backwards-compatibility

我有两台机器,一台运行 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/

相关文章:

gcc - 强制使用 cmake 提供的最新 gcc

ruby-on-rails - 制作脚本使用 1.8.7,Rails 使用 1.9.2

c++ - 在调用 recv() 之前检查错误

windows - PostgreSQL 数据库可以在 Windows Server 2012 R2 上运行吗

c++ - D3DXERR_INVALIDDATA 发生

windows - 是否可以覆盖 Windows 中的默认文件夹浏览器对话框?

c++ - boost mpl序列模式匹配

此语言级别不支持 Java- Diamond 类型

c++ - 使用 GCC 在 Linux 上 boost 链接

python - 在 cygwin 中为 boost_python 链接 c++ 类