Функция объявлена, но не определена в разделяемой библиотеке - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть исходный код какой-то библиотеки. Существует функция, которая только объявлена ​​(в заголовочном файле), но не определена в исходном коде.

extern "C"  {
    extern int theFunc(int);
}

По какой причине в библиотеке указывается только объявление функции?

1 Ответ

0 голосов
/ 07 ноября 2018

В дополнение к ответу Майка Кингхана (который охватывает большинство случаев), есть также (довольно необычная) причина объявить в заголовочном файле библиотеки функцию, не реализованную в этой библиотеке. Иногда эта библиотека ожидает плагин , и ожидается, что пользователь предоставит такой плагин (в некотором роде, возможно, передавая имя файла плагина какой-то другой функции). Библиотека будет использовать методы динамической загрузки (такие как dlopen (3) в Linux) для установки такого плагина. И он получит некоторую конкретную функцию (с dlsym (3) в Linux) из плагина. Тогда имеет смысл объявить , но не определить такую ​​функцию плагина в заголовках библиотеки.

Я признаю, что этот случай необычен и надуман.

Для конкретного примера прочитайте о плагинах GCC . Ваш плагин должен #include "gcc-plugin.h", который косвенно объявляет

/* Declaration for "plugin_init" function so that it doesn't need to be
   duplicated in every plugin.  */
extern int plugin_init (struct plugin_name_args *plugin_info,
                        struct plugin_gcc_version *version);

но plugin_init должно быть определено кодом вашего плагина. Тогда GCC будет dlopen ваш плагин, используя что-то эквивалентное

void*plhdl = dlopen("/home/you/yourplugin.so", RTLD_NOW);

и позже получите указатель на функцию, используя

typeof(plugin_init)* funptr = dlsym(plhdl, "plugin_init");

Обратите внимание, что символ plugin_init не не появляется в сегменте кода GCC.

Другим примером является инфраструктура Qt (набор библиотек). Читайте о плагинах Qt .

...