我的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
我错过了什么吗?
答案 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时自动链接的原因。