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

问题描述:

我正在C++中的Linux上通过将一堆代码与静态库(.a)链接来构建共享库。我有一个静态库中定义的方法。当我使用纳米-C打印在静态库中的元件是显示为:C++与静态库中的std :: string相关的未定义符号

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

符号未在输出定义.so文件(我建立图书馆),但是当我列出了未定义使用纳米符号-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常量&和第二个使用的std :: __ 1 :: basic_string的,性病:: __ 1 ::分配器>常量&

我想明白为什么它不是找到符号。两者不应该匹配,因为它们本质上是一样的吗?

对于上下文,我试图编译一个Alembic Importer,它与Linux的虚幻编辑器4一起提供。我试图链接的图书馆是alembic图书馆。

+0

你的问题不清楚。 “我将静态库(.a)链接到Linux上的共享库(.so)”是什么意思。您是否正在使用现有的.a文件并将其重新链接到.so文件。您是否将.a文件与现有的.so文件链接起来。如果你“链接一个静态库”文件,“输出.so文件”从哪里来,突然间。你需要让你的问题更清楚。 –

+1

它可以像libstdC++ vs libC++吗?就像当你编译.a时一样,你使用'-stdlib = libstdC++',而当你编译.so时,它是'-stdlib = libC++',反之亦然? – Paul

+0

感谢您的回复。我为虚幻编辑器创建了一个共享库(最终输出.so)的插件。该共享库依赖于静态库。所以我从一堆代码和一个现有的.a文件中创建一个新的.so。 – Luke

您正试图链接编译为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 === 

在你的系统中的文件可能在不同的位置,但结果守; D是相同的。

+0

我认为你是对的..如果我有足够的声望,就会upvote。谢谢! – Luke