是否可以创建一个 C++ 程序,只链接到 libcstdc ++,而不链接到 libc? [关闭]
Posted
技术标签:
【中文标题】是否可以创建一个 C++ 程序,只链接到 libcstdc ++,而不链接到 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
上使用 <<
运算符将调用 write()
的 libc 实现。
所以:可能不会。如果您在任何类型的 UNIX 系统上,libstdc++ 将依赖于 libc,因此您需要链接 libc。 (Windows 是一个相当不同的情况,但听起来不像您正在使用的那样。)
【讨论】:
C++ 标准包括大部分 C 标准库。所以它是一种依赖,从技术上讲,它是 C++ 标准库的一部分。【参考方案2】:大多数 C 标准库函数实际上也是 C++ 标准库(简称“STL”)的一部分。例如,提供 std::malloc()
和 std::system()
等函数的 <cstdlib>
标头就是其中的一部分的 STL。
请注意,即使您从未明确使用过这些函数之一,STL 仍会将它们用作实现细节。例如std::copy()
可能会调用std::memcpy()
。比较两个 std::string
对象可能会导致调用 std::memcmp()
。
在许多情况下,编译器本身也会这样做。例如new
可能会导致调用std::malloc()
,而delete
可能会调用std::free()
。或者如果 noexcept
函数抛出,C++ 标准表示将调用 std::terminate()
,这反过来又定义为默认调用 std::abort()
,这是来自 <cstdlib>
的 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++ 程序,只链接到 libcstdc ++,而不链接到 libc? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
是否可以动态链接到 libcsd-client.so 以在 Galaxy S4 I9505 上启用通话录音