我应该使用libc ++还是libstdc ++?[关闭]


91

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


1
我不知道,但是您可能会发现感兴趣的地方:clang-developers.42468.n3.nabble.com/…–
DarenW

3
这个答案可能会有所帮助。
谢艳涛

2
如果您链接到opencv,则使用libstdc ++。这里的原因stackoverflow.com/questions/13037659/...
Loozie

Answers:


89

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

libc ++在GNU / Linux上不是100%完整的,而libstdc ++更完整时使用libc并没有真正的优势。另外,如果您想链接到其他任何用C ++编写的库,那么几乎可以肯定它们都是使用libstdc ++构建的,因此也需要使用libstdc ++进行链接。

这里有更多有关libc ++在各种平台上的完整性的信息。


3
您能否详细说明/提供有关Linux上libc ++完整性状态的链接?我不太明白为什么这是特定于平台的,因为libc ++只是一堆标准库头文件。还是您的意思是需要将Clang wrt构建为Linux上未很好支持的LLVM运行时库?
TemplateRex

1
@TemplateRex,我不知道当前状态,您可以查看libcxx.llvm.org。我不遵循libc ++,所以您问的是错误的人,但是您是否建议“一堆Standard Library标头”永远不会包含任何特定于平台的代码?
Jonathan Wakely 2013年

好吧,既然您可以在运行Mac OS X的几乎相同的Apple硬件上安装Linux,我不知道C ++头文件中的平台依赖性来自何处?也许一些围绕内置CPU内部函数或IO的包装程序以及异常处理内容是系统相关的,但我的理解是,此类内容是在librcxxrt类型的二进制层中处理的。标准库标头不是应该插入更多还是更少?
TemplateRex

4
我不是在谈论硬件。同样,我对libc ++不了解,但是大多数C ++标准库都是通过OS的C库实现的,例如,从std::ctype_base::mask值到<ctype.h>常量的映射完全依赖于平台。(CPU内在函数由编译器提供,异常处理由低级ABI层完成,但IO通常完全在C ++和C库中完成,而不是低级内容)。
Jonathan Wakely 2013年

1
@abergmeier,这是个虚假的参数,因为(与GCC或其他合格的编译过程一起使用时)libstdc ++不会对使用它的代码施加任何限制,无论是动态链接还是静态链接。不是LGPL。请不要散布FUD。gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq.license.what
Jonathan Wakely

30

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

  1. 与Apple和FreeBSD不同,GPL + 3不是问题,因此无需在此处实现另一个堆栈。
  2. 多年来,围绕GNU libstd ++开发Linux组件。其中一些没有任何其他基础。
  3. 尽管libc ++在新功能方面很强大,但它在遗留代码方面存在一些问题。

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

就像乔纳森(Jonathan)所说的那样,您应该使用默认情况下包含的任何工具。由于Clang已配置为GCC替代品,因此在Linux中可以安全使用Clang,因此在此方面,您不必担心2个编译器。另外,由于您的目标是两个平台,因此请看一下cmake。


2
Clang不是GCC的替代品...只是另一个编译器。
艾萨克·帕斯夸

4
@IsaacPascual Mario的意思是,clang正式具有其设计目标,可以替代您在其上运行的平台(例如,在Linux上运行时的gcc)上出色的编译器。与intel的编译器afaik相同。这是他们获得更广泛采用的方式。
JohanBoulé'18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.