С++ совместно используемая библиотека, вызываемая из C

У меня есть общая библиотека, написанная на С++. Он экспортирует видимый интерфейс из extern "C" функций, которые создают, уничтожают и манипулируют непрозрачными типами.

Теперь я хотел бы иметь чистую программу на C, которая использует эту библиотеку.

Могу ли я сделать это (платформа самостоятельно)? Когда инициализируется среда выполнения С++ и статические объекты С++, если main не написана на С++?

Ответ 1

Фаза инициализации зависит от платформы. В случае Linux динамически загружаемые библиотеки могут иметь специально объявленные символы, которые автоматически вызывается dlopen() при загрузке библиотеки.

См. справочную страницу для dlopen(3), раздел Устаревшие символы init() и fini() для получения дополнительной информации.

Статические инициализаторы неявно помечены как __attribute__((constructor)), поэтому, как правило, вам не нужно делать ничего особенного, чтобы их вызывали при загрузке разделяемой библиотеки. Я подозреваю, что это то же или похожее на других платформах.

Ответ 2

Могу ли я сделать это (платформа самостоятельно)?

Загрузка библиотеки - это зависимая от платформы операция.

Когда будут инициализироваться среда выполнения С++ и статические объекты С++ если main не написан на С++?

Не имеет значения. Они будут инициализированы до ввода основной информации.

Ответ 3

Обычно для общих библиотечных систем есть своя точка входа, в которой для этой работы, а не main, но библиотеки DLL имеют DLLMain, где реализация может помещать такой код. Однако в общем случае это не ваше дело, а работа любого компилятора, с которым вы использовали эту проблему.