С++ совместно используемая библиотека, вызываемая из C
У меня есть общая библиотека, написанная на С++. Он экспортирует видимый интерфейс из extern "C"
функций, которые создают, уничтожают и манипулируют непрозрачными типами.
Теперь я хотел бы иметь чистую программу на C, которая использует эту библиотеку.
Могу ли я сделать это (платформа самостоятельно)? Когда инициализируется среда выполнения С++ и статические объекты С++, если main
не написана на С++?
Ответы
Ответ 1
Фаза инициализации зависит от платформы.
В случае Linux динамически загружаемые библиотеки могут иметь специально объявленные символы, которые автоматически вызывается dlopen()
при загрузке библиотеки.
См. справочную страницу для dlopen(3)
, раздел Устаревшие символы init() и fini() для получения дополнительной информации.
Статические инициализаторы неявно помечены как __attribute__((constructor))
, поэтому, как правило, вам не нужно делать ничего особенного, чтобы их вызывали при загрузке разделяемой библиотеки. Я подозреваю, что это то же или похожее на других платформах.
Ответ 2
Могу ли я сделать это (платформа самостоятельно)?
Загрузка библиотеки - это зависимая от платформы операция.
Когда будут инициализироваться среда выполнения С++ и статические объекты С++ если main не написан на С++?
Не имеет значения. Они будут инициализированы до ввода основной информации.
Ответ 3
Обычно для общих библиотечных систем есть своя точка входа, в которой для этой работы, а не main
, но библиотеки DLL имеют DLLMain
, где реализация может помещать такой код. Однако в общем случае это не ваше дело, а работа любого компилятора, с которым вы использовали эту проблему.