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

我通过在Linux中使用C将一堆代码与静态库(.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&

我试图了解为什么找不到符号.两者本质上是相同的,所以不应该匹配吗?

就上下文而言,我正在尝试为Linux虚幻编辑器4附带一个Alembic Importer.我尝试链接的库是Alembic库.

解决方法:

您正在尝试链接根据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 ===

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

上一篇:c#-无法下载适用于Windows Mobile 5.0应用程序的EMDK


下一篇:javascript-“代理”将“ this [toString]”与“ this [Symbol.toStringTag]”混淆