C ++ разделяемая библиотека вызывается из C - PullRequest
11 голосов
/ 23 декабря 2011

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

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

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

Ответы [ 3 ]

5 голосов
/ 23 декабря 2011

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

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

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

4 голосов
/ 23 декабря 2011

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

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

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

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

1 голос
/ 23 декабря 2011

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

...