C++11 对boost::program\u options::options\u description::options\u description的未解析引用

C++11 对boost::program\u options::options\u description::options\u description的未解析引用,c++11,boost,debian-buster,C++11,Boost,Debian Buster,首先,我知道有几篇类似的帖子,但我还是要问一下。Debian“Buster”和boost 1.67包中的boost程序选项::选项描述是否存在已知问题 我有Debian7开发的代码,系统升级到8.3,然后是8.11,现在使用Boost1.55 代码生成并运行。现在,使用Boost 1.67将系统升级到Debian Buster,并获取对选项描述(const std::string&,unsigned int,unsigned int)的未解析引用的链接错误以及其他几个程序选项函数。除了选项描述之

首先,我知道有几篇类似的帖子,但我还是要问一下。Debian“Buster”和boost 1.67包中的boost程序选项::选项描述是否存在已知问题

我有Debian7开发的代码,系统升级到8.3,然后是8.11,现在使用Boost1.55

代码生成并运行。现在,使用Boost 1.67将系统升级到Debian Buster,并获取对选项描述(const std::string&,unsigned int,unsigned int)的未解析引用的链接错误以及其他几个程序选项函数。除了选项描述之外,所有未解决的问题都来自boost调用另一个boost函数,因此我的代码中甚至没有直接调用。链接行中有boost_程序_选项。 我不是一个新手,了解链接顺序,这与链接顺序无关。 我将尝试获取boost和building的源代码,看看这是否可行,如果不行,我将从头开始构建一个系统并进行测试。 由于这一切都是在一个封闭的网络上进行的,仅仅说尝试更新版本的boost或Debian不是一个选项,因为我在合同上有义务只使用Debian“Buster”和boost 1.67作为最新版本,因此如果Buster中没有(更新的)包,这是不可能的,在没有新合同起草和审批的情况下,可能需要几个月的时间


所以说到这个问题,Buster中的Boost的开箱即用版本有问题吗?

我认为Buster中的包不会有问题

我最好的选择是

  • 您正在将旧对象与新库重新链接,但它们不匹配(您是否进行了完全清理,例如,以消除这种可能性?)

    通常,构建系统不具有完整的头依赖关系,因此 生成系统可能没有注意到boost标头已更改, 需要重建对象

  • 如果这不能解释这一点,那么include路径上可能会出现另一个版本的boost,即使在重建时也会出现与#1下相同的问题

    您可以通过检查命令行(
    make-Bsn
    compile\u commands.json
    ,例如,取决于您的工具)来确定这一点。另一个技巧是包含
    boost/version.hpp
    并查看
    boost\u version
    的计算结果

  • 最后,在使用不同的编译器版本或编译器标志构建库时可能会出现问题,从而导致不兼容的SYNBOL(这是一个QoI问题,您可能希望向Boost开发人员报告)

    这是假设ABI/ODR问题,以防您想要验证这种可能性


  • 我认为巴斯特的包裹不会有问题

    我最好的选择是

  • 您正在将旧对象与新库重新链接,但它们不匹配(您是否进行了完全清理,例如,以消除这种可能性?)

    通常,构建系统不具有完整的头依赖关系,因此 生成系统可能没有注意到boost标头已更改, 需要重建对象

  • 如果这不能解释这一点,那么include路径上可能会出现另一个版本的boost,即使在重建时也会出现与#1下相同的问题

    您可以通过检查命令行(
    make-Bsn
    compile\u commands.json
    ,例如,取决于您的工具)来确定这一点。另一个技巧是包含
    boost/version.hpp
    并查看
    boost\u version
    的计算结果

  • 最后,在使用不同的编译器版本或编译器标志构建库时可能会出现问题,从而导致不兼容的SYNBOL(这是一个QoI问题,您可能希望向Boost开发人员报告)

    这是假设ABI/ODR问题,以防您想要验证这种可能性


  • 尝试添加代码示例,但插入过程中不断出现错误。请仔细检查链接错误。我认为,代码中应该有一些对旧版本boost的引用。换句话说,您使用了boost 1.67的新标题,但1.55的旧libs似乎已通过apt get purge libboost*删除。请检查您的链接错误。确保对boost libs的引用正确。确切的错误是“对boost::program\u options::options\u description::options\u description(常量std::string&,unsigned int,unsigned int)”所有库在添加代码示例时都是1.67.0,但在插入过程中不断出现错误。请仔细检查链接错误。我认为,代码中应该有一些对旧版本boost的引用。换句话说,您使用了boost 1.67的新标题,但1.55的旧libs似乎已通过apt get purge libboost*删除。请检查您的链接错误。确保对boost libs的引用正确。确切的错误是“对boost的未解析引用::program_options::options_description::options_description(const std::string&,unsigned int,unsigned int)”所有库都是1.67.0代码是从头构建的,请保持干净,即使是从干净的git克隆。甚至编写了一个干净的stub.cpp,其中只有一行是“options_description desc”(“foo”);仍然得到错误。重建了boost库,一切都很好。发现库也存在不匹配的进一步问题。由于系统在一个封闭的网络上,我仍然需要确定debian mirror是否已过时。系统上没有其他库版本,因此也不要重新链接旧对象。因此,上面的#3是剩下的唯一选项,即包是使用不同的标志构建的,因此与我的构建不兼容。如何知道用于构建库的编译器标志是什么?您可以从文档中了解。在deb回购的情况下,“文件”在deb中-