【问题标题】:Should I use libc++ or libstdc++? [closed]我应该使用 libc++ 还是 libstdc++? [关闭]
【发布时间】:2013-02-05 00:22:55
【问题描述】:

我正在使用 c/c++ 为 osx 和 linux 开发命令行界面可执行文件。该项目将链接到opencv。我应该使用 libc++ 还是 libstdc++?

【问题讨论】:

标签: linux macos opencv libstdc++ libc++


【解决方案1】:

我会为每个操作系统使用本机库,即 GNU/Linux 上的 libstdc++ 和 Mac OS X 上的 libc++。

libc++ 在 GNU/Linux 上不是 100% 完整的,当 libstdc++ 更完整时使用它并没有真正的优势。此外,如果你想链接到任何其他用 C++ 编写的库,它们几乎肯定是用 libstdc++ 构建的,所以你也需要链接到它才能使用它们。

更多信息here关于libc++在各种平台上的完整性。

【讨论】:

  • 您能否详细说明/提供有关 Linux 上 libc++ 完整性状态的链接?我不太明白为什么这将是特定于平台的,因为 libc++ 只是一堆标准库头文件。或者您的意思是需要将 Clang wrt 构建到 Linux 上不太支持的 LLVM 运行时库?
  • @TemplateRex,我不知道现在的状态,你可以看看libcxx.llvm.org。我不关注 libc++,所以你问错人了,但你是在暗示“一堆标准库头文件”永远不会有任何特定于平台的代码吗?
  • 好吧,既然您可以在运行 Mac OS X 的几乎相同的 Apple 硬件上安装 Linux,我想知道 C++ 标头中的平台依赖性来自哪里?也许一些围绕内置 CPU 内在函数或 IO 和异常处理东西的包装器是系统相关的,但我的理解是这些东西是在 librcxxrt 类型的二进制层中处理的。标准库头文件不应该或多或少是可插入的吗?
  • 我不是在谈论硬件。同样,我不知道 libc++,但大多数 C++ 标准库都是通过操作系统的 C 库实现的,例如从std::ctype_base::mask 值到<ctype.h> 常量的映射完全依赖于平台。 (CPU 内部函数由编译器提供,异常处理由低级 ABI 层完成,但 IO 通常完全在 C++ 和 C 库中完成,而不是低级的东西)。
  • @abergmeier,这是一个虚假的论点,因为(当与 GCC 或其他符合条件的编译过程一起使用时)libstdc++ 不会对使用它的代码施加任何限制,无论是动态链接还是静态链接。这不是 LGPL。请不要传播 FUD。 gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq.license.what
【解决方案2】:

主要的 Linux 发行版不提供 LLVM libc++,因为:

  1. 与 Apple 和 FreeBSD 不同,GPL+3 不是问题,因此无需 在这里实现另一个堆栈。
  2. Linux 组件已经围绕 GNU libstd++ 开发了很长时间。他们中的一些 不要建立在其他任何东西上。
  3. 虽然 libc++ 具有强大的新功能,但它在遗留代码方面存在一些问题。

如果最终 libc++ 成为发行版的一部分,它将成为可选组件。链接它可能需要额外的选项。

就像 Jonathan 所说,您应该使用默认包含的任何工具。 Clang 在 Linux 中使用是安全的,因为它被配置为 GCC 替代品,因此在这方面您不必担心 2 个编译器。此外,由于您的目标是两个平台,因此您应该看看 cmake。

【讨论】:

  • Clang 不是 GCC 的替代品...只是另一个编译器。
  • @IsaacPascual 马里奥的意思是,clang 的设计目标是在您运行它的平台(例如,在 linux 上运行时的 gcc)上替代突出的编译器。英特尔的编译器 afaik 也是如此。这是他们获得更广泛采用的方式。
猜你喜欢
  • 1970-01-01
  • 2012-06-20
  • 2013-05-23
  • 2010-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多