lld неопределенный символ: mainCRTStartup
Мой код cpp:
int main(int argc, char** argv) {}
Я использую следующую команду, чтобы скомпилировать и связать ее:
// I want to read the result ir
clang -S -emit-llvm main.cpp
// I want to compile directly from ir
llc -filetype=obj main.ll
lld -flavor link main.obj // <root>: undefined symbol: mainCRTStartup Link failed
Я что-то пропустил?
2 ответа
Вам нужно пройти libcmt.lib
тоже вроде так lld-link main.obj libcmt.lib
,
Если вы бежите clang-cl main.cpp /FA
а затем посмотрите на main.asm, вы увидите следующие строки:
.section .drectve,"yn"
.ascii " /DEFAULTLIB:libcmt.lib"
.ascii " /DEFAULTLIB:oldnames.lib"
Вот почему libcmt.lib автоматически связывается, когда вы не проходите через llc.
mainCRTStartup - это функция, определенная CRT (который, вероятно, неявно использует clang на первом шаге, и генерирует IR-файл с mainCRTStartup в качестве точки входа)
Попробуйте передать -nostdlib для лягушки на первом шаге
Это будет означать, что вы не сможете использовать стандартные библиотечные функции, хотя
Если вы хотите использовать функции CRT, но связываетесь с lld, вам нужно ссылаться на нативные библиотеки