Re[4]: -D_GLIBCXX_USE_CXX11_ABI=0 лишь для одной подключаемо
От: watchmaker  
Дата: 01.03.17 22:02
Оценка:
Здравствуйте, wl., Вы писали:

wl.>не очень понял, что именно невозможно? Для динамических либ насколько я понимаю, аби не важен, там главное calling convention.

Ещё как важен. ABI должно совпадать. И всё равно какая там сборка: статическая или динамическая через so/dll.

wl.> для теста можно попробовать экспортировать одну функцию, чтобы проверить, будет ли такая конструкция работать в принципе


Если передаешь объекты С++, то значение _GLIBCXX_USE_CXX11_ABI должно совпадать с обоих сторон. Иначе гарантированно работать не будет.

Но тут можно сделать важное замечание: если объектов C++ в интерфейсе библиотеки нет, то и от флага _GLIBCXX_USE_CXX11_ABI зависимости не будет.

Поэтому повсеместно используется такой подход: сама программа или библиотека пишется на том языке на котором удобно (хоть на С++, хоть на Python, хоть на чём) с любыми опциями компилятора. Но наружу вытаскивается только интерфейс на С. Тут дело в том, что он на большинстве платформ просто стандартизирован и таким образом части программы оказываются автоматически совместимыми между собой.

И такая обёртка C ↔ C++ пишется вручную довольно просто.
Например, если раньше метод принимал на вход на чтение std::string, то можно написать прокси-функцию, которая возьмёт этот параметр, заменит его на пару параметров const char* и size_t (указатель на начало и длину), вызовет функцию из so с этими параметрами, а функция из so из этих данных снова воссоздаст std::string, но который уже будет в другом пространстве ABI, то есть теперь этот std::string можно безболезненно передавать дальше в проблемную библиотеку.

В общем ничего сложного. Хотя, конечно, довольно муторно каждый раз писать код упаковки и распаковки какого-нибудь std::unordered_set, поэтому встречаются всякие тулзы по автоматизации этих действий.
Да даже вот тут в соседнем разделе кто-то пишет генератор таких обёрток: http://rsdn.org/forum/prj/6425341
Автор: GhostCoders
Дата: 22.04.16



Ну а совет вынести эту библиотеку в отдельную so-шку всё же хороший. Меньше будет возможности накосячить при сборке.
То есть главное, что нужно сделать, это собрать проблемную библиотеку в so, но выставить наружу только интерфейс в стиле C.
Отредактировано 01.03.2017 22:02 watchmaker . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.