c++ - 函数已声明,但未在共享库中定义
问题描述
我有一些库的源代码。有一个函数仅被声明(在头文件中),但未在源代码中定义。
extern "C" {
extern int theFunc(int);
}
库中只有函数声明的原因是什么?
解决方案
除了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 插件的信息。
推荐阅读
- python - 如何删除打印的最后一个字符?蟒蛇 3
- mysql - Mysql集群锁定所有行
- php - 我可以将 Laravel 4.2 刀片包含在它自己的控制器中吗?
- javascript - testcafe - 如何断言文本包含在 html 正文中
- javascript - 为什么我的对象显示为未定义,但它存在!反应原生
- java - testng.xml 正在跳过测试?
- visual-studio - 无法解析引用(Xamarin 构建 iOS)
- javascript - 将两个 gulp 任务合并到一个 JS 文件中
- javascript - 如何仅选择第一个“if”以在javascript中设置标记可见为真
- sql - Impala - 在 Impala SQL 中 Stuff 和 'For Xml Path' 如何工作