Вызов функций-членов с помощью std :: string params из моего dylib создает & quot; неопределенные символы & quot; ошибки

При попытке связать с динамической библиотекой, которую я создал с помощью Xcode 6.3.2, все мои вызовы функций класса, которые имеют параметры std :: string, отказываются ссылаться:

Undefined symbols for architecture x86_64:
“MyClass::Bogus(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool)”,…

Включается файл .h dylib, а член открытого класса имеет прототип:

int Bogus(std::string& aStringRef, bool verbose);

ИНТЕРЕСНО, если я изменю тип этого первого параметра std :: string на long (и вызову его с long в качестве первого параметра), ошибки ссылки не будет. Так что я знаю, что определенно связываюсь с созданным мной дилибом.

Для моего dylib стандартная библиотека Apple LLVM 6.1 C ++ установлена ​​по умолчанию (libstdc ++).

Код, из которого я делаю вызов, сам по себе является .dylib и компилируется и связывается не из Xcode, а целиком из make-файла. Версия с ++, используемая для компиляции из этого make-файла:

Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn)
Target: x86_64-apple-darwin14.4.0
Thread model: posix

Одна вещь, которая кажется мне подозрительной, заключается в том, что вызывающий код компилируется с использованием «-std = c ++ 1y», который может использовать стандартную библиотеку для C ++ 14. Может быть конфликт между стандартной библиотекой, которая связана для вызывающая программа с той, которую я выбрал для сборки dylib? (код моего dylib компилируется с помощью диалекта компилятора = GNU ++ 98)

0

Решение

Трудно передать объекты стандартной библиотеки между различными двоичными модулями, потому что их двоичные представления и детали реализации не стандартизированы.

Чтобы это работало, вам нужно убедиться, что все модули используют одинаковый — и, вероятно, одну и ту же версию — компилятор, реализацию стандартной библиотеки и все связанные параметры компиляции (исключения, отладка итераторов и т. Д.) … Который в основном побеждает цель иметь динамическую библиотеку во-первых.

При передаче данных вам следует либо придерживаться простых указателей (c-строк, буферов данных), либо вводить некоторые пользовательские, более прозрачные типы данных.

Смотрите следующие ответы для некоторых конкретных решений:

Передача std :: string в API библиотеки

Передача ссылки на вектор STL через границу dll

2

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


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector