libc ++またはlibstdc ++を使用する必要がありますか?[閉まっている]


91

私はc / c ++を使用してosxとlinuxの両方のコマンドラインインターフェイス実行可能ファイルを開発しています。プロジェクトはopencvに対してリンクします。libc ++またはlibstdc ++を使用する必要がありますか?


1
私は知りませんが、あなたが興味のある本を見つけることがあります。clang-developers.42468.n3.nabble.com/...
DarenW

3
この答えは役に立つかもしれません。
Yantao Xie

2
opencvに対してリンクする場合は、libstdc ++を使用してください。これがstackoverflow.com/questions/13037659/…

回答:


89

OSごとにネイティブライブラリを使用します。つまり、GNU / Linuxではlibstdc ++、Mac OSXではlibc ++を使用します。

libc ++はGNU / Linuxで100%完全ではなく、libstdc ++がより完全である場合にそれを使用することに実際の利点はありません。また、C ++で記述された他のライブラリにリンクする場合は、ほぼ確実にlibstdc ++でビルドされているため、それらを使用するには、ライブラリにもリンクする必要があります。

さまざまなプラットフォームでのlibc ++の完全性については、こちらをご覧ください。


3
Linuxでのlibc ++の完全性ステータスに関する詳細/リンクを提供していただけますか?libc ++は単なる標準ライブラリヘッダーの集まりであるため、これがプラットフォーム固有である理由がよくわかりません。それとも、Linuxで十分にサポートされていないLLVMランタイムライブラリにClang wrtをビルドする必要があるということですか?
templateRex

1
@TemplateRex、現在のステータスはわかりません。libcxx.llvm.orgを参照してください。私はlibc ++をフォローしていないので、間違った人に質問していますが、「標準ライブラリヘッダーの束」にプラットフォーム固有のコードが含まれないことを示唆していますか?
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. Linuxコンポーネントは、GNU libstd ++を中心に長年にわたって開発されてきました。それらのいくつかは他のものの上に構築されていません。
  3. libc ++は新機能に強いですが、レガシーコードにはいくつかの問題があります。

最終的にlibc ++がディストリビューションの一部になった場合、それはオプションのコンポーネントになります。それに対してリンクするには、おそらく追加のオプションが必要になります。

ジョナサンが言ったように、デフォルトで含まれているツールを使用する必要があります。ClangはGCCの代替として構成されているため、Linuxで安全に使用できます。そのため、2つのコンパイラについて心配する必要はありません。また、2つのプラットフォームをターゲットにしているため、cmakeを確認する必要があります。


2
ClangはGCCの代替ではありません...単なる別のコンパイラです。
アイザックパスクアル2016年

4
@IsaacPascual Marioが意味するのは、clangの設計目標が、実行するプラットフォーム上の著名なコンパイラ(Linuxで実行する場合はgccなど)のドロップイン置換になることです。Intelのコンパイラafaikについても同じです。それは、より幅広い採用を得るための彼らの方法です。
ヨハン・ブール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.