我有一个目标文件(a.obj),我需要通过命令行的链接器调用获取可执行文件(a.exe)。我从这个程序收到了a.obj文件:
#include "stdio.h"
int main(){
puts("Hello world");
}
我使用clang编译器生成带有后续参数的a.obj文件:“clang.exe -c a.cpp”。
我的问题是使用“puts”方法,它在标准库中定义(可能是libvcruntime.lib),我不知道用于链接到标准库的参数。
我的链接器这是Microsoft link.exe,我也可以从llvm项目获得lld链接器(它更优先)。
我的全局目标 - 这是从llvm ir获取可执行文件并从代码调用lld链接器但是其他历史记录:)
如果您正在使用Clang构建Windows,并且您想使用Visual C ++的标准库,我建议您使用clang-cl
,它是一个将Visual C ++ cl命令行选项转换为clang的本机选项的驱动程序。
你说你写的是:
clang -c a.cpp
-c
选项要求编译器只生成和对象文件并停止(而不是将目标文件发送到链接器)。听起来你想要clang来调用链接器,所以你应该省略-c
。
要使用标准库的静态版本,请指定/MT
(如果需要标准库的调试版本,请指定/MTd
)。
总而言之,这应该对你有用:
clang-cl /MT a.cpp
clang-cl
将把/MT
翻译为clang的等效选项,然后运行clang。当clang完成编译目标文件时,它将自动调用lld(LLVM链接器),其选项与用于编译的选项兼容,这将导致工作的可执行文件。
有一段时间,当使用clang编译Windows时,你需要使用Microsoft的LINK而不是lld。但是最近的版本可以使用lld,事实上,默认情况下会使用lld。