首页 > 解决方案 > 函数已声明,但未在共享库中定义

问题描述

我有一些库的源代码。有一个函数仅被声明(在头文件中),但未在源代码中定义。

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

库中只有函数声明的原因是什么?

标签: c++shared-librariesstatic-libraries

解决方案


除了Mike Kinghan 的回答(涵盖了大多数情况)之外,还有一个(相当不寻常的)理由在库头文件中声明一个未在该库中实现的函数。有时,该库需要一个插件,而用户需要提供这样一个插件(以某种方式,可能将插件文件名传递给其他函数)。该库将使用动态加载技术(例如Linux 上的dlopen(3))来安装这样的插件。它会从插件中获取一些特定的功能(在 Linux 上使用dlsym(3) )。那么声明而不是定义是有意义的这样的插件函数,在库头文件中。

我承认这个案子是不寻常的和做作的。

有关具体示例,请阅读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 插件的信息。


推荐阅读