вызов функций с параметрами STL из общей библиотеки - PullRequest
10 голосов
/ 12 апреля 2011

Я знаю, что невозможно безопасно экспортировать параметры функции C ++ (например, строки STL), потому что C ++ не определяет стандартный ABI.(Я читал это как ответ на Как вызвать функцию из общей библиотеки? )

Люди склонны считать, что , если ваша библиотека и ваша программа былипостроенный с тем же компилятором , тогда это не проблема, но, к сожалению, для некоторых компиляторов VC ++ это не совсем так.переносимые типы (например, встроенные типы) вместо функции, которая принимает string.

т.е. вместо использования std::string в интерфейсе модуля

 std::string Translate( const std::string & );

используйте

void Translate( const char *src, char* dest, size_t destSize );

Хотя они согласны, что это довольно сложно как для вызывающей, так и дляcallee, они не предлагают более хорошую альтернативу.

Как можно легко передать более сложный объект, такой как std::map, используя низкоуровневые типы?(не говоря уже о такой сложной вещи, как map<string,vector<something_complex> >)

Как вы решаете такие случаи при экспорте функций?

1 Ответ

4 голосов
/ 12 апреля 2011

Мало того, что вы должны были собрать программу с использованием одного и того же компилятора (или совместимого ABI), вы должны были использовать те же настройки: режим отладки и выпуска, DLL и статический режим, проверенные итераторы (или нет), и скоро. С одной стороны, STLPort сделал все правильно: std::string при построении их библиотеки переименовывается в отдельные символы, основанные на этих настройках, что полностью исключает проблему.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...