如何与标准库进行静态链接C++?
How to make static linking with C++ standard library?
我有一个对象文件(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
- 基于boost的程序的静态链接——zlib问题
- 使用gcc从静态链接的文件中查找可选符号
- 使用转换器提升 Python 问题 - 静态链接
- C++实用程序::转换在静态链接库中不起作用
- 将源中的 GLEW 与 cmake 静态链接
- 在发布模式下启动使用库的静态链接编译的应用程序时出错
- libavdevice 和 x11 的静态链接库应该以什么顺序链接?
- 静态链接启用 PIC 的库时出现链接器 PIC 错误
- 静态链接库时,收到链接器错误:找不到 -lgcc_s
- 静态链接 glibc & boost_python36 for Python extension
- 我可以在C++中配置静态链接吗?
- 协议缓冲区的静态链接会导致与现有符号冲突
- C++标准是否定义了结构中成员函数的函数内定义是否必须具有静态链接?
- 静态链接 Visual Studio dll 到动态链接的 sfml 项目
- 我可以加载与库静态链接的 dll 吗?
- 静态链接MSVC库,动态链接Qt
- C++:找不到静态链接
- OpenSSL AES仅适用于某些计算机,即使具有静态链接也是如此
- CURL 静态链接未解析的外部符号
- 如何强制Windows.h在Visual Studio中静态链接而不是动态链接?