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

问题描述 投票:1回答:2

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

c++ linker clang static-linking
2个回答
0
投票

视觉工作室

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

LIB

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


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。

© www.soinside.com 2019 - 2024. All rights reserved.