g++ - 类似于 Rust 的 build-std

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

我想编译一个C++程序,使其动态链接到libc,但不动态依赖libstdc++。例如,使用 std::cout 的“hello world”,当使用

-static-libstdc++ -flto
标志编译时,输出可执行文件的大小为 1 MB(Arch linux amd64)。我想要类似于在 rust 中使用
build-std
的效果,以便“hello world”程序无论使用 std::cout 还是使用 printf 占用的空间都相同。

c++ g++ clang++ static-linking
1个回答
0
投票

C++ 的 iostream 库,包括

std::cout
,是一个巨大的库。

如果您正在使用它,您要么需要链接到包含大型库的动态库,要么需要静态链接它并将大型库包含在可执行文件中。

C++ 编译器消除它并将所有内容转换为 C 调用是不可能的。

如果您重新编译整个 C++ 库链并使用链接时间优化,您的编译器可能会积极地找出一种方法将其减少为 C 调用,但即使这样也不太可能 - iostream 的相对复杂性很高,很多内部虚拟类,所有这些都需要相当多的运气才能完全优化。

现在,C++ 标准库的其他部分并非如此;其中许多都可以合理地进行优化,例如标准容器和大多数算法库。坦率地说,只是 iostreams 臃肿且设计不佳,尤其是考虑到您的目标。这是一个早期的 C++ 库,已经是几十年前的事了。

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