Я хочу иметь плагин с более простым именем для разрешения в другом коде C ++.
class B {
};
extern "C" B foo(); // to avoid name mangling in order to be loaded by dlsym
А в другой части программы (которая также находится на C ++ и имеет то же определение класса B с плагином):
B (*func)();
func = dlsym("/path/to/so", "foo");
B m = func();
Будет ли такой код вызывать какие-либо проблемы, то есть разрешено ли (по стандарту) использовать класс C ++ в качестве параметра или возвращаемого типа в extern "C"
функционировать? Похоже, работает на моем GCC, но как насчет других?
Это должно работать, с несколькими условиями:
Объявление foo () как extern "C"
конечно, позволит вам загрузить его через dlsym () с использованием фактического, не исправленного имени функции, но в противном случае это не повлияет на то, как вы используете эту функцию после загрузки.
Обычные правила все еще применяются. Если вы нарушите бинарную совместимость foo () или класса B, вам нужно будет перекомпилировать плагин так же, как вам пришлось бы перекомпилировать его, если бы это была обычная динамическая библиотека, не загруженная во время выполнения.
Это будет работать до тех пор, пока вы придерживаетесь C ++ и только C ++. По понятным причинам вы не сможете скомпилировать объявление своей функции в модуле перевода Си. (Т.е. вы никогда не сможете должным образом объяснить компилятору C, что B
является.)
Итак, единственная проблема, которую я вижу здесь, это значение тега [C] в вашем вопросе. Вам также нужна какая-то перекрестная совместимость с C?