在 C++ 中,动态编译接口可以通过使用插件(plugin)或者共享库(shared library)来实现。这里给出一个简单的示例,展示如何使用共享库来实现动态编译接口。
// plugin_interface.h
#pragma once
class PluginInterface {
public:
virtual ~PluginInterface() {}
virtual void execute() = 0;
};
// plugin_impl.cpp
#include "plugin_interface.h"
class PluginImpl : public PluginInterface {
public:
void execute() override {
// 实现插件的具体功能
}
};
g++ -shared -fPIC plugin_impl.cpp -o libplugin.so
// main.cpp
#include <iostream>
#include <dlfcn.h>
#include "plugin_interface.h"
typedef PluginInterface* (*CreatePluginFunc)();
int main() {
// 加载共享库
void* handle = dlopen("./libplugin.so", RTLD_LAZY);
if (!handle) {
std::cerr << "Failed to load shared library: " << dlerror() << std::endl;
return 1;
}
// 获取插件创建函数
CreatePluginFunc createPluginFunc = reinterpret_cast<CreatePluginFunc>(dlsym(handle, "createPlugin"));
if (!createPluginFunc) {
std::cerr << "Failed to find symbol 'createPlugin': " << dlerror() << std::endl;
dlclose(handle);
return 1;
}
// 创建插件实例
PluginInterface* plugin = createPluginFunc();
if (!plugin) {
std::cerr << "Failed to create plugin instance." << std::endl;
dlclose(handle);
return 1;
}
// 调用插件的 execute 函数
plugin->execute();
// 释放插件实例和共享库句柄
delete plugin;
dlclose(handle);
return 0;
}
g++ main.cpp -o main
g++ -shared -fPIC plugin_impl.cpp -o libplugin.so
./main
这个示例展示了如何在 C++ 中使用共享库实现动态编译接口。你可以根据自己的需求对这个示例进行扩展,例如添加插件注册机制、支持多种插件类型等。