У меня есть пользовательские функции, написанные на С++, и они используют множество стандартных библиотек С++, таких как iostream
, map
, vector
, я могу добавить свои функции в JIT, используя addObjectFile
, но standard libraries' functions
не могу найти, как я могу связать их с моим JIT?
Мой случай:
ffi.cpp
#include <iostream>
extern "C" int add(int a, int b) {
std::cout << ">>add function run" << std::endl;
return a + b;
}
main.cpp, built/ffi
создан clang++ ffi.cpp -c -o build/ffi
int main(int argc, char *argv[]) {
InitLLVM X(argc, argv);
InitializeNativeTarget();
InitializeNativeTargetAsmPrinter();
ThreadSafeContext context(std::make_unique<LLVMContext>());
ExitOnError ExitOnErr;
auto JTMB = ExitOnErr(JITTargetMachineBuilder::detectHost());
JTMB.setCodeModel(CodeModel::Small);
auto jit =
ExitOnErr(LLJITBuilder()
.setJITTargetMachineBuilder(std::move(JTMB))
.create());
char ffi_file[] = "build/ffi";
jit->addObjectFile(ExitOnErr(errorOrToExpected(MemoryBuffer::getFileAsStream(ffi_file))));
Функция add
может быть найдена, но функции iostream не найдены и запускаются с ошибкой:
JIT session error: Symbols not found: [ __Unwind_Resume, __ZNKSt3__16locale9use_facetERNS0_2idE, __ZNKSt3__18ios_base6getlocEv, __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEmc, __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev, __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE3putEc, __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE5flushEv, __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryC1ERS3_, __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryD1Ev, __ZNSt3__14coutE, __ZNSt3__15ctypeIcE2idE, __ZNSt3__16localeD1Ev, __ZNSt3__18ios_base33__set_badbit_and_consider_rethrowEv, __ZNSt3__18ios_base5clearEj, __ZSt9terminatev, ___cxa_begin_catch, ___cxa_end_catch, ___gxx_personality_v0, _memset, _strlen ]
Failed to materialize symbols: { (0x7fd514708170, { __ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m, __ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc, __ZNSt3__111char_traitsIcE11eq_int_typeEii, __ZNSt3__111char_traitsIcE3eofEv, __ZNSt3__111char_traitsIcE6lengthEPKc, _main, _link, _add, ___clang_call_terminate, __ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4_ }) }