与静态库中的 std::string 相关的 C++ 未定义符号

Posted

技术标签:

【中文标题】与静态库中的 std::string 相关的 C++ 未定义符号【英文标题】:C++ Undefined symbol related to std::string in static lib 【发布时间】:2017-07-08 11:39:32 【问题描述】:

我通过在 C++ 中的 Linux 上将一堆代码与静态库 (.a) 链接来构建共享库。我在静态库中定义了一个方法。当我使用 nm -C 打印该静态库中的符号时,显示为:

 Alembic::AbcCoreFactory::v9::IFactory::getArchive(std::string const&, Alembic::AbcCoreFactory::v9::IFactory::CoreType&)

符号未在输出 .so 文件(我正在构建的库)中定义,但是当我使用 nm -uC 列出未定义的符号时,它会打印:

Alembic::AbcCoreFactory::v9::IFactory::getArchive(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, Alembic::AbcCoreFactory::v9::IFactory::CoreType&)

区别在于第一次使用 std::string const& 而第二次使用 std::__1::basic_string, std::__1::allocator > const&

我试图理解为什么它没有找到符号。两者本质上是一样的,不应该匹配吗?

就上下文而言,我正在尝试编译随 Unreal Editor 4 for linux 一起提供的 Alembic 导入器。我试图链接的库是 alembic 库。

【问题讨论】:

您的问题不清楚。 “我将静态库(.a)链接到 Linux 上的共享库(.so)”是什么意思。您是否正在获取现有的 .a 文件并将其重新链接到 .so 文件。您是否将 .a 文件与现有 .so 文件链接。如果您正在“链接静态库”文件,那么“输出 .so 文件”是从哪里来的,突然之间。你需要让你的问题更清楚。 可以是 libstdc++ vs libc++ 之类的吗?就像在构建 .a 时使用 -stdlib=libstdc++ 而在构建 .so 时使用 -stdlib=libc++ 一样,反之亦然? 感谢您的回复。我正在为虚幻编辑器创建一个插件,它是一个共享库(最终输出 .so)。该共享库依赖于静态库。所以我正在从一堆代码和一个现有的 .a 文件中创建一个新的 .so 。 @paul 也许吧?能详细点吗? @Paul:好点子。 OP 应该这样读:***.com/questions/8454329/… - __1 是相关的。 【参考方案1】:

您正在尝试链接针对libc++(clang 的标准C++ 库)编译的代码和针对libstdc++(gcc 的标准C++ 库)编译的代码。这不会很好地工作。

对照您的库进行检查。

在我的系统上:

> nm -DC /usr/lib64/libc++_shared.so | grep 'std::__1'
  === lots of output ===
> nm -DC /usr/lib64/libc++_shared.so | grep 'std::basic'
  === nothing ===
> nm -DC /usr/lib/gcc/x86_64-pc-linux-gnu/6.2.0/libstdc++.so.6 | grep 'std::__1'
  === nothing ===
> nm -DC /usr/lib/gcc/x86_64-pc-linux-gnu/6.2.0/libstdc++.so.6 | grep 'std::basic'
  === lots of output ===

在您的系统上,文件可能位于不同的位置,但结果应该是相同的。

【讨论】:

我认为你是对的 .. 如果我有足够的声誉,我会投票。谢谢!

以上是关于与静态库中的 std::string 相关的 C++ 未定义符号的主要内容,如果未能解决你的问题,请参考以下文章

C语言中有string吗?

ustring - std::string/std::wstring 的就地替换?

C++ 静态库中的共享全局变量:Linux

c# string与c++ std::string的互相转换

c# string与c++ std::string的互相转换

如何初始化std :: vector的静态constexpr成员 在c ++ 11中?