Я создаю общую библиотеку, связывая кучу кода со статической библиотекой (.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.
Вы пытаетесь связать код, скомпилированный против 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 ===
В вашей системе файлы могут находиться в разных местах, но результат должен быть одинаковым.
Других решений пока нет …