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

How to make static linking with C++ standard library?

本文关键字:静态 链接 C++ 标准      更新时间:2023-10-16

我有一个对象文件(a.obj),我需要通过命令行的链接器调用获取可执行文件(a.exe)文件。 我从这个程序收到了一个.obj文件:

#include "stdio.h"
int main(){
puts("Hello world");
}

我使用clang编译器生成带有后续参数的a.obj文件:"clang.exe-c a.cpp"。

我的问题是使用"puts"方法,该方法在标准库(可能是libvcruntime.lib)中定义,我不知道使用哪些参数链接到标准库。

我的链接器这是Microsoft链接.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。

Visual Studio

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

文档

-static-libstdc++ -static-libgcc. docs