【问题标题】:What's the difference between `std::basic_string` and `std::__1::basic_string`?`std::basic_string` 和 `std::__1::basic_string` 有什么区别?
【发布时间】:2021-04-07 14:14:52
【问题描述】:

ninja(版本:1.9.0)输出:

mergetree_test.cpp:(.text+0x19f): undefined reference to `DB::executeQuery(std::string const&, DB::Context&, bool, DB::QueryProcessingStage::Enum, bool)'

nm -A mergetree_test.o | grep executeQuery | c++filt 输出:

mergetree_test.o:                 U DB::executeQuery(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, DB::Context&, bool, DB::QueryProcessingStage::Enum, bool)

但我从链接库中获得了输出,其中executeQuery 使用相同的方法定义。

libdbms.a:executeQuery.cpp.o:0000000000008750 T DB::executeQuery(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, DB::Context&, bool, DB::QueryProcessingStage::Enum, bool)

__1 是什么意思?我该如何解决这个问题?

【问题讨论】:

  • 哪个编译器,哪个版本?
  • g++ (GCC) 10.2.0

标签: c++ g++ libc++ ninja


【解决方案1】:

我怀疑您正在尝试合并使用 libc++ 和 libstdc++ 编译的库。

libc++ 将(几乎)所有符号放入std::_1::,而 libstdc++ 将其符号放入std::

【讨论】:

    【解决方案2】:

    你问了两个问题,所以我要回答主要的问题(__1 是什么?):

    __1 是一个内联命名空间,位于std

    namespace std
    {
        inline namespace __1
        {
            // string, ...
        }
    }
    

    inline 表示不必指定结构/函数/变量位于该命名空间中,因此可以简单地使用std::string 而不是std::__1::string

    至于您为什么会出错:如果您不提供一些代码,我们无法知道。

    【讨论】:

    • 为什么mergetree_test.o中的符号没有__1,而我依赖的库有?这可能是问题所在。
    猜你喜欢
    • 1970-01-01
    • 2010-12-12
    • 2015-07-23
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    • 2018-03-11
    • 2017-03-10
    • 1970-01-01
    相关资源
    最近更新 更多