我有一个目标文件(a.obj),需要从命令行通过链接器调用获取可执行文件(a.exe)。 我从该程序收到a.obj文件:
#include "stdio.h"
int main(){
puts("Hello world");
}
并且我用clang编译器生成带有后续参数的“ .obj”文件:“ clang.exe -c a.cpp”。
我的问题是使用“ puts”方法,该方法在标准库(可能是libvcruntime.lib)中定义,我不知道要使用哪些参数链接到标准库。
我的链接器是Microsoft link.exe,我也可以从llvm项目获得lld链接器(更可取)。
我的全局目标-这是从llvm ir获取可执行文件并从代码中调用lld链接器,但这是其他历史记录:)
答案 0 :(得分:0)
答案 1 :(得分:0)
如果要使用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。