【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
和上位机一样,我们的智能硬件如果想应用到更多的场景,那么势必需要实现更多的算法。这些算法和算法之间最好是松散耦合的插件形式,而不是hard code强连接的,因为这样才能更好地适应客户的场景需要。目前大部分嵌入式硬件都是使用linux作为os进行开发的,所以我们只需要了解一下在linux系统下面,实现动态插件的话应该怎么处理。
1、了解dlopen函数、dlclose函数
所谓的动态插件,就是把算法和各个子功能变成一个一个动态库。这些动态库之间可以进行数据的交换。不仅仅如此,我们还可以创建一个全局变量动态库,这些全局变量可以被这些动态库插件共享,这都是可以的。要实现这一点,每个动态库必须抽象出相同的公共接口,只有这样才能被统一的执行引擎调用,用dlopen打开、用dlclose关闭。
2、创建一个简单的动态库
为了说明如何显示地访问这些动态库,首先我们创建一个简单的动态库。这个比较容易,
// example.c
#include <stdio.h>
void hello_world() {
printf("Hello, World!\n");
}
编译方法也不复杂,
gcc -fPIC -shared -o libexample.so example.c
3、访问和使用动态库
既然动态库创建好了,那么就要创建一个可执行文件来访问这个动态库。目前动态库里面唯一可执行的函数就是hello_world,所以我们要做的就是dlopen打开libexample.so,接着用访问hello_world这个函数就可以了,
// main.c
#include <stdio.h>
#include <dlfcn.h>
int main() {
// 通过dlopen加载动态链接库
void *handle = dlopen("./libexample.so", RTLD_LAZY);
if (!handle) {
fprintf(stderr, "Error: %s\n", dlerror());
return 1;
}
// 通过dlsym获取函数指针
void (*hello_world)() = dlsym(handle, "hello_world");
if (!hello_world) {
fprintf(stderr, "Error: %s\n", dlerror());
dlclose(handle);
return 1;
}
// 调用函数
hello_world();
// 关闭动态链接库
dlclose(handle);
return 0;
}
代码的内容不复杂,大家可以自己查看一下。接着我们开始编译,
gcc -o main main.c -ldl
最后就是执行main文件,输入./main即可。不出意外,我们就可以看到这样的内容,
feixiaoxing@raspberrypi:~/Desktop/dll $ ./main
Hello, World!