如何使用C ++标准库进行静态链接?

时间:2019-04-01 14:25:59

标签: c++ linker clang static-linking

我有一个目标文件(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链接器,但这是其他历史记录:)

2 个答案:

答案 0 :(得分:0)

Visual Studio

在项目配置中指定/MT(d)而不是/MD(d)docs

-static-libstdc ++ -static-libgcc。 docs

答案 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。