在C语言中,创建一个模块系统(动态加载)涉及到使用动态链接库(Dynamic Link Library,简称DLL)或共享对象(Shared Object,简称SO)。这里我们将以Linux系统为例,使用共享对象来实现模块化。
模块系统允许在程序运行时动态加载和卸载功能模块。这样可以在不重新编译和链接整个程序的情况下,增加或更新程序的功能。模块系统的主要优势是提高程序的可扩展性和可维护性。
module.h
),定义模块的接口函数。// module.h
#ifndef MODULE_H
#define MODULE_H
#include<stdio.h>
typedef int (*module_function_t)(int, int);
int load_module(const char *module_path, module_function_t *module_function);
void unload_module(void);
#endif // MODULE_H
load_module
)。// module.c
#include <dlfcn.h>
#include "module.h"
static void *module_handle = NULL;
int load_module(const char *module_path, module_function_t *module_function) {
module_handle = dlopen(module_path, RTLD_LAZY);
if (!module_handle) {
fprintf(stderr, "Failed to load module: %s\n", dlerror());
return -1;
}
*module_function = dlsym(module_handle, "module_function");
if (dlerror() != NULL) {
fprintf(stderr, "Failed to find module function: %s\n", dlerror());
dlclose(module_handle);
return -1;
}
return 0;
}
void unload_module(void) {
if (module_handle) {
dlclose(module_handle);
module_handle = NULL;
}
}
my_module.c
)。// my_module.c
#include "module.h"
int module_function(int a, int b) {
return a + b;
}
$ gcc -shared -o my_module.so my_module.c
// main.c
#include<stdio.h>
#include "module.h"
int main(void) {
module_function_t module_function = NULL;
if (load_module("./my_module.so", &module_function) == 0) {
int result = module_function(3, 4);
printf("Result: %d\n", result);
unload_module();
}
return 0;
}
$ gcc main.c module.c -o main
$ ./main
Result: 7
这样,我们就实现了一个简单的模块系统,可以在程序运行时动态加载和卸载功能模块。
领取专属 10元无门槛券
手把手带您无忧上云