Ответ 1
EDIT:
Ошибка оказалась вызвана отсутствием поддержки TLS в JITer. Этот ответ описывает еще одну проблему, связанную с привязкой и lli
.
Если вы посмотрите на сгенерированный IR из clang++ -std=c++11 -S -emit-llvm test.cpp
, вы обнаружите, что многие из символов, например. _ZNSt6futureIiE3getEv
, объявляются, но не определены. Компоновщик никогда не вызывается, поскольку -S "Выполнять только шаги препроцесса и компиляции" (clang --help).
lli
выполняет только ИК-модуль и не связывает "неявное" соединение, как он должен знать, к каким библиотекам следует подключаться?
В этом есть разные решения, в зависимости от того, почему вы используете lli:
- скомпилировать и связать IR-модуль:
llc main.cpp && clang++ -lpthread main.s
(требуется pthread s. Каковы правильные параметры ссылок для использования std:: thread в GCC под Linux?) - (неподтвержденный) используйте
LD_PRELOAD="x.so y.so"
для принудительной загрузки библиотек перед запускомlli
- JIT модуль программно и используйте
LoadLibraryPermanently(nullptr)
(добавляет символы программы в пространство поиска) иLoadLibraryPermanently(file, err)
для дополнительных libs (s. http://llvm.org/docs/doxygen/html/classllvm_1_1sys_1_1DynamicLibrary.html)
Я могу только догадываться о том, почему libС++ работает для вас, поскольку он терпит неудачу на моей машине, но, по-видимому, это так, потому что он загружается в lli уже и lli вызывает sys::DynamicLibrary::LoadLibraryPermanently(nullptr)
, чтобы добавить символы программы в свое пространство поиска JIT ( s. https://github.com/llvm-mirror/llvm/blob/release_40/tools/lli/OrcLazyJIT.cpp#L110).