我正在编写一个将其他 3 个模块分开的插件系统:
- plugin_system.c - 系统的核心
- list.c - 包含用于插件存储的链表实现
- plugin_interface.h - 包含插件所需的声明,没有与
plugin_interface.h 仅包含以下类型和函数:
extern int plugin_register(PluginManager *plug_manager, const char *name, Plugin *plug);
在 plugin_system.c 中定义
加载插件时,插件系统会查找一个功能init_plugname()
并调用它,该函数必须调用plugin_register
来注册插件。
该程序是用复杂的递归 Makefiles 编译的(不是最好的主意),但我试图实现的是:
我在主程序文件夹中编译插件系统对象,然后将其与主程序链接。从make
执行:
gcc -Wall -O2 -std=gnu99 -D DEBUG -g -fPIC -c -o /home/kowa/code/reseaux/projet/ringo/c/bin/list.o list.c
gcc -Wall -O2 -std=gnu99 -D DEBUG -g -fPIC -c -o /home/kowa/code/reseaux/projet/ringo/c/bin/plugin_system.o plugin_system.c
插件编译后跟gcc -fPIC -c -o plugname.o plugname.c plug_system.o
gcc -o plugname.so plugname.o plug_system.o -shared
我尝试在我的主程序中加载插件并收到此错误:
symbol lookup error: ./plugins/zyva.so: undefined symbol: exists
exists
是 plugin_system 模块用来存储插件的列表模块中的一个函数,上面提到的plugin_register
函数调用它。
以前从未做过这种系统,我也不是共享库的专家,我想问题在于我如何编译整个项目,我可能会错过一些链接......
我只是忘了将插件与 plugin_system.o 使用的 list.o 链接......