是否可以创建一个 C++ 程序,只链接到 libcs​​tdc ++,而不链接到 libc? [关闭]

Posted

技术标签:

【中文标题】是否可以创建一个 C++ 程序,只链接到 libcs​​tdc ++,而不链接到 libc? [关闭]【英文标题】:Is it possible to create a C ++ program, just linking to libcstdc ++, without linking to libc? [closed] 【发布时间】:2019-08-01 01:59:22 【问题描述】:

我开始学c++了,有个疑问,当我使用ldd程序看到动态库的依赖时,注意到除了c++标准库libstdc++之外,libc也是编译后,没有libc,只有libstdc ++可以使程序可执行吗?

如何编译这段代码?

#include <iostream>

int main(void) 
    std::cout << "AAA";
    return 0;

【问题讨论】:

取决于您的实施。 libstdc++ 的大多数实现都依赖于 libc,因此它们需要它。 可以静态链接libc和libstdc++ C++ 标准包括大部分 C 标准库。所以它是一种依赖,从技术上讲,它是 C++ 标准库的一部分。 【参考方案1】:

在大多数 UNIX 平台上,libc 包含基本系统调用包装器的实现,例如 read()write()_exit()。所有应用程序都使用这些函数,包括用 C++ 编写的函数。事实上,许多 C++ 标准库函数的实现都会使用这些包装器——例如,在 std::cout 上使用 &lt;&lt; 运算符将调用 write() 的 libc 实现。

所以:可能不会。如果您在任何类型的 UNIX 系统上,libstdc++ 将依赖于 libc,因此您需要链接 libc。 (Windows 是一个相当不同的情况,但听起来不像您正在使用的那样。)

【讨论】:

C++ 标准包括大部分 C 标准库。所以它是一种依赖,从技术上讲,它是 C++ 标准库的一部分。【参考方案2】:

大多数 C 标准库函数实际上也是 C++ 标准库(简称“STL”)的一部分。例如,提供 std::malloc()std::system() 等函数的 &lt;cstdlib&gt; 标头就是其中的一部分的 STL。

请注意,即使您从未明确使用过这些函数之一,STL 仍会将它们用作实现细节。例如std::copy() 可能会调用std::memcpy()。比较两个 std::string 对象可能会导致调用 std::memcmp()

在许多情况下,编译器本身也会这样做。例如new 可能会导致调用std::malloc(),而delete 可能会调用std::free()。或者如果 noexcept 函数抛出,C++ 标准表示将调用 std::terminate(),这反过来又定义为默认调用 std::abort(),这是来自 &lt;cstdlib&gt; 的 C 库函数。

大多数 C++ 编译器和库实现将简单地重复使用 C 库而不是重新实现它。换句话说,从 C++ 程序的角度来看,libc 可以被认为是 libstdc++ 的一部分。它恰好被拆分成一个单独的库文件。所以如果你链接到libstdc++,你也需要链接到libc。

【讨论】:

我认为referring to the C++ standard library as the "STL" might not be entirely correct。 @AlexanderZhang 按照惯例,它被改写为“Standard Library,因为大多数人只是称它为 STL。编写“C++ 标准库” " 每次都很累。现在人们说“STL”时,他们指的不是斯捷潘诺夫的图书馆。

以上是关于是否可以创建一个 C++ 程序,只链接到 libcs​​tdc ++,而不链接到 libc? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

是否可以动态链接到 libcs​​d-client.so 以在 Galaxy S4 I9505 上启用通话录音

在 emscripten 中禁用链接 libc

Android NDK编译如何强制使用libc++.a的静态链接库

在应用程序中嵌入 C++ 编译器

内部libc函数调用必须通过.plt

VS2019 C++动态链接库的创建使用