5

我的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

我错过了什么?

4

2 回答 2

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"

这就是当您不通过 llc 时导致 libcmt.lib 自动链接的原因。

于 2018-08-26T19:36:20.293 回答
1

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

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

不过,这意味着您将无法使用标准库函数

如果您想使用 CRT 函数但与 lld 链接,则需要在本机库中链接

于 2017-04-15T15:11:27.047 回答