linux — C ++ Неопределенный символ, связанный с std :: string в статической lib

Я создаю общую библиотеку, связывая кучу кода со статической библиотекой (.a) в Linux на C ++. У меня есть метод, определенный в статической библиотеке. Когда я использую 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&

Я пытаюсь понять, почему он не находит символ. Разве эти два не должны совпадать, так как они по сути одинаковы?

Для контекста я пытаюсь скомпилировать Alembic Importer, который поставляется с Unreal Editor 4 для Linux. Библиотека, в которой я пытаюсь создать ссылку, является библиотекой alembic.

3

Решение

Вы пытаетесь связать код, скомпилированный против libc++ (стандартная библиотека C ++ Clang) и код, скомпилированный против libstdc++ (стандартная библиотека C ++ для gcc). Это не будет работать слишком хорошо.

Сверьтесь с вашими библиотеками.

В моей системе:

> 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 ===

В вашей системе файлы могут находиться в разных местах, но результат должен быть одинаковым.

4

Другие решения

Других решений пока нет …