lld undefined symbol:mainCRTStartup

时间:2016-04-22 02:31:21

标签: llvm-clang lld

我的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 个答案:

答案 0 :(得分:0)

mainCRTStartup是CRT定义的一个函数(clang可能在第一步中隐式使用,并生成一个带有mainCRTStartup作为入口点的IR文件)

尝试在第一步中将-nostdlib传递给clang

这意味着您无法使用标准库函数,但

如果您想使用CRT功能但链接到lld,则需要链接到本机库

答案 1 :(得分:0)

您也需要通过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时自动链接的原因。