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, вам нужно ссылаться на нативные библиотеки

Другие вопросы по тегам