如何查找boost运行时版本

2024-05-13

我正在编写一个使用 boost 的 C++ 库。

在这个库中,我想包含有关用于编译我的库的二进制版本的 boost 版本的信息。 我可以使用宏BOOST_VERSION这很好。

我还想确定哪个是 boost 的运行时版本,以便我可以与用于编译我的库的 boost 版本进行比较。显然我不能使用该宏,因为它会在编译时而不是运行时为我提供硬编码版本。

我需要的是 boost 中的一个函数(比如boost::get_version())。有没有办法在 boost 中做到这一点?


您可以使用宏来创建一些代码,如下所示:

std::cout << "Using Boost "     
          << BOOST_VERSION / 100000     << "."  // maj. version
          << BOOST_VERSION / 100 % 1000 << "."  // min. version
          << BOOST_VERSION % 100                // patch version
          << std::endl;

这适用于 boost 1.51.x 及更高版本。不确定这是否是您正在寻找的,我会继续看看是否有办法以更优雅的方式从当前加载的 dll 中获取它。

附录:

要查找运行时版本:

查看 Boost 系统后,您似乎可以做您正在寻找的事情的最简单方法是拥有平台相关代码,该代码在编译时使用来生成不同版本的可执行文件。

对于 Windows:

您需要使用以下命令查询 DLL 的版本获取文件版本信息Ex API http://msdn.microsoft.com/en-us/library/aa969434%28VS.85%29.aspx or 获取文件版本信息 API http://msdn.microsoft.com/en-us/library/ms647003%28VS.85%29.aspx,您还需要考虑操作系统是 32 位还是 64 位,因此这里有一些可能有用的代码:

typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
LPFN_ISWOW64PROCESS IsWow64ProcessFunc;

BOOL is64BitOS()
{
    BOOL retval= FALSE;
    // need to check if the OS is 64 bit, and we cant therefore indiscrimately call the 64 bit function for this, so we use the following:
    IsWow64ProcessFunc= (LPFN_ISWOW64PROCESS) GetProcAddress(GetModuleHandle(TEXT("kernel32")),"IsWow64Process");

    if(IsWow64ProcessFunc != NULL)
    {
        if (!IsWow64ProcessFunc(GetCurrentProcess(),&bIsWow64))
        {
            // your error handling code in here
        }
    }
    return retval;
}

然后我们可以使用简单的代码来获取 DLL 的版本:

void myWindowsDLLVersionChecker()
{
    DWORD  versionHandle = NULL;
    UINT   size      = 0;
    LPBYTE buffer  = NULL;
    DWORD  versionSize   = GetFileVersionInfoSize( szVersionFile, &versionHandle);

    if (verSize != NULL)
    {
        LPSTR versionData = new char[versionSize];

        if (GetFileVersionInfo( szVersionFile, versionHandle, versionSize, versionData))
        {
            if (VerQueryValue(versionData,"\\",(VOID FAR* FAR*)&buffer,&size))
            {
                if (size)
                {
                    VS_FIXEDFILEINFO *versionInfo = (VS_FIXEDFILEINFO *)buffer;
                    if (versionInfo->dwSignature == 0xFEEF04BD)  // value from http://msdn.microsoft.com/en-us/library/windows/desktop/ms646997(v=vs.85).aspx
                    {
                        if(is64BitOS())    //  if it is true then its a 64 bit Windows OS
                        {
                                major =     (versionInfo->dwProductVersionMS >> 16) & 0xff;
                                minor =     (versionInfo->dwProductVersionMS >>  0) & 0xff;
                                revision =  (versionInfo->dwProductVersionLS >> 16) & 0xff;
                                build =     (versionInfo->dwProductVersionLS >>  0) & 0xff;
                        } 
                        else //  32 bit Windows OS
                        {
                                major =     HIWORD(versionInfo->dwProductVersionMS);
                                minor =     LOWORD(versionInfo->dwProductVersionMS);
                                revision =  HIWORD(versionInfo->dwProductVersionLS);
                                build =     LOWORD(versionInfo->dwProductVersionLS);
                        }
                    }
                }
            }
        }
        delete[] versionData;
    }
}

对于Linux:

目前非常不记得代码了,但是这是记忆中的部分解决方案(我现在手头没有 Linux 机器,稍后会更详细地检查这一点,但最多只需要进行少量修改即可工作)。

void myLinuxDLLVersionChecker() 
{
    // call readelf as an external proces son libboost_system.so, 
    // and use the information returned to extract the version from.
    // or use something like
    setenv("LD_TRACE_LOADED_OBJECTS", "1", 1);
    FILE *ldd = popen("/lib/libboost_system.so");
    //  information from http://linux.die.net/man/8/ld.so
    // the above pretty much replicates ldd's output, so you can pick out the version
}

结合两者:

要使相同的事情在多个操作系统中发生,您可能必须使用类似的东西:

#ifdef __unix__                    /* __unix__ is usually defined by compilers targeting Unix systems */
void detectBoostDllVersion()  // does not have to be void, can be whatever you need
{
    myLinuxDLLVersionChecker();
}
#elif defined(_WIN32) || defined(WIN32)     /* _Win32 is usually defined by compilers targeting 32 or   64 bit Windows systems */
void detectBoostDllVersion()  // has to match the same return type as the previous version
{
    myWindowsDLLVersionChecker();
}
#endif

现在,根据编译的操作系统,正确的函数将由detectBoostDLLVersion()功能 :)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何查找boost运行时版本 的相关文章

  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri

随机推荐

  • 从 HList 获取元素

    我尝试了 HList 并按预期进行了以下工作 val hl 1 foo HNil val i Int hl 0 val s String hl 1 但是 我无法让以下代码正常工作 让我们暂时假设对列表进行随机访问是一个聪明的主意 class
  • 如何在 PuTTY 中保存并运行 Java 文件?

    我是 AWS 亚马逊网络服务 的新手 所以这可能是一个基本问题 我在 AWS 上创建了一个 EC2 实例 我有一台 Windows 计算机 因此我使用 PUTTY 来连接 Linux 实例 连接到我的 EC2 实例后 我使用以下命令编写 J
  • 如何比较两个对象数组并更改两个数组中找到的对象的值?

    假设我有两个对象数组 let array1 id 1 name snow id 4 name jo id 8 name bran id 12 name gondo id 13 name peter
  • 有没有办法获取 PHP 中可用区域设置的列表?

    在Java中 你可以调用Locale getAvailableLocales 获取可用区域设置的列表 我期待 PHP 的同等功能Locale http php net manual en class locale php类 但找不到 有没有
  • 如何对主索引重新编号

    我有一个简单的 MySQL 表 主索引 id 不是一一编号的 1 31 35 100 等 我希望它们的编号如 1 2 3 4 请告诉我该怎么做 我还想指出的是 我知道该操作可能产生的后果 但我只是想整理一下表格 我同意其他方法也可以 但我只
  • UITableView 无法一直滚动到底部[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我只是好奇 我做了一些UITable
  • Bootstrap 3 在移动设备上滑入菜单/导航栏 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我正在构建一个基于浏览器的移动应用程序 我决定使用 Bootstrap 3 作为设计的 CSS 框架 Bootstrap
  • 将数据集导出到 EXCEL

    我使用以下代码将数据库表中的字段导出到 Excel 中 我想要做的是能够编写一条 SQL 语句从多个表中检索字段并将其导出到 Excel 中 这段代码只允许我导出一张表 另外 如何显示保存提示对话框 示例代码将不胜感激 非常感谢 prote
  • 当 Android 上的脸部靠近屏幕时,以编程方式关闭屏幕

    我的应用程序是一个拨号器 当用户将手机靠近头部时 我需要关闭屏幕并防止单击控件 就像本机 Android 拨号器行为一样 我需要什么 API 级别以及如何以正确的方式做到这一点 我通过反汇编一个非常著名的 VoIP 应用程序找到了解决方案
  • 我们如何在odoo中继承BaseModel类

    需要继承BaseModel类并添加一个新属性 例如 auto True register False name None columns constraints custom False defaults rec name None par
  • 计算网页内的字数

    我需要使用 python3 计算网页内的单词数 我应该使用哪个模块 网址库 这是我的代码 def web f urllib request urlopen https americancivilwar com north lincoln h
  • 如何在不加载关联模型的情况下检查 has_one 是否存在

    我有一个简单的 has one 关系 class User lt ApplicationRecord has one detail has many courses end class Detail lt ApplicationRecord
  • 无法删除临时文件夹(有时)

    当我启动应用程序时 我创建一个临时文件夹 public static File createTempDir String name throws IOException File tempDir File createTempFile na
  • 使用 getopt_long (C++) 如何为两个需要参数编写长选项和短选项?

    include
  • 有人知道 Drupal 7 的分面搜索解决方案吗?

    分面搜索模块不会被移动到 Drupal 7 我有什么选择 The 搜索API模块 http drupal org project search api是 Drupal 7 的新增功能 允许您从各种后端中进行选择 包括Solr http dr
  • 子视图的子层与更高的子视图重叠

    我有一个问题 我正在创建一个UIView这是从方法返回的 这部分很好 但我注意到 当我将子层添加到其中一个子视图时 这些层与子层添加的层次结构中较高的子视图 textView 和 imageView 重叠到testViewCopy出现在这些
  • 如何模糊视图

    I have a view having different colors I need to blur the background of that view for example There is LinearLayout in wh
  • 在express中root后通过可选参数传递路由控制?

    我正在开发一个简单的网址缩短应用程序 并有以下快速路线 app get function req res res render index link null app post function req res function makeR
  • jQuery 和所有 .js 文件无法在本地运行,只能在外部运行

    我有一个奇怪的问题 我正在编写一个网站 包括 jQuery 和一些插件 它们存储在 js 文件夹中 当我尝试通过浏览器 jQuery 打开它时 插件和所有自定义脚本都不起作用 也许这与我的代码有关 但不这么认为 当然 当我在外部包含 jQu
  • 如何查找boost运行时版本

    我正在编写一个使用 boost 的 C 库 在这个库中 我想包含有关用于编译我的库的二进制版本的 boost 版本的信息 我可以使用宏BOOST VERSION这很好 我还想确定哪个是 boost 的运行时版本 以便我可以与用于编译我的库的