#include
#include
#include
#include
std::string generateCode(const std::string& functionCode) {
return R"(
#include
extern "C" float userFunction(float x) {
)" + functionCode + R"(
}
)";
}
bool compileCode(const std::string& code, const std::string& filename) {
std::ofstream file(filename + ".cpp");
if (!file.is_open()) {
std::cerr << "Unable to open file for writing" << std::endl;
return false;
}
file << code;
file.close();
std::string command = "g++ -fPIC -shared -o " + filename + ".so " + filename + ".cpp";
return std::system(command.c_str()) == 0;
}
typedef float (*UserFunction)(float);
int main() {
std::string userFunctionCode = R"(
return std::sin(x);
)";
std::string code = generateCode(userFunctionCode);
std::string filename = "user_function";
if (!compileCode(code, filename)) {
std::cerr << "Compilation failed" << std::endl;
return 1;
}
void* handle = dlopen(("./" + filename + ".so").c_str(), RTLD_LAZY);
if (!handle) {
std::cerr << "Cannot open library: " << dlerror() << std::endl;
return 1;
}
UserFunction userFunction = (UserFunction)dlsym(handle, "userFunction");
const char* dlsym_error = dlerror();
if (dlsym_error) {
std::cerr << "Cannot load symbol 'userFunction': " << dlsym_error << std::endl;
dlclose(handle);
return 1;
}
float result = userFunction(0.5);
std::cout << "Result: " << result << std::endl;
dlclose(handle);
return 0;
}
В C++ возможность динамической компиляции и выполнения кода пользователя не столь тривиальна, как в некоторых других языках, например, в C# с использованием Roslyn. Однако, существуют подходы и библиотеки, которые позволяют компилировать и выполнять пользовательский код в C++.
float sin(float x);
Через какой-нибудь textbox. Как можно потом имплементировать этот код пользователя в программе?
В какую сторону копать, как эта тема называется?