web-dev-qa-db-ja.com

コンパイルされたC ++ 11ライブラリ(lib、dllなど)を古いC ++コンパイラでリンクできますか?

古いC++コンパイラ(VS2008やgcc3.4など)は、C++ 11で記述された外部ライブラリとリンクできますか?

私の考えでは、C++ 11の.libファイルはこの段階では単なるバイトコードであり、それが何らかの方法で解決可能で呼び出し可能である限り、古いコンパイラーがどのように生成されたかを気にする必要はありません。

APIがC++ 03ユーザーをサポートする小さなライブラリを開発しています。だから、楽しみにして、std::unique_ptrなどの便利な機能を使用して自分のライブラリを実装してもいいのか、それともboost::だけを使用する必要があるのか​​と思います。

12
Konafa

ライブラリがその実装でC++ 11のみを使用し、C++ 11の機能や型を公開していない場合、特に静的リンケージを使用している場合は、そうです。これは可能であり、標準ですらあります。

ライブラリがCレベルのインターフェイスを公開する(最も多様なクライアントが使用できるようにする)が、C++で内部的に実装されている一般的なケースを考えてみましょう。このようなライブラリにリンクするクライアントは、パブリックバイナリAPI(エクスポートされた関数)についてのみ心配する必要があります。これは、互換性を最大にするためにレガシーC/C++に制限されます。 A Javaプログラムは、C++で内部的に実装されているCレベルのAPIにリンクできます。これはJavaが「C++をサポートする」必要があることを意味しません。同様に、古いスタイルのC/C++クライアントは、C++ライブラリまたは他のライブラリのより前衛的なバージョンを内部で使用するCレベルまたはC++レベルのAPIにリンクできます。2つの別個のもの:ライブラリのインターフェースにリンクするために必要なもの、およびライブラリ自体が内部的にリンクするもの(または静的に取り込むもの)。

ライブラリのクライアントを実装の依存関係にさらさないでください。

依存関係(C++ 11など)をライブラリに静的にリンクできる場合、これはクリーンで自己完結型です。ライブラリは真のブラックボックスです。バイトコードだけです。ただし、ライブラリが「暗黙の動的」リンケージを介して依存関係にリンクしている場合でも(明示的なLoadLibrary/GetProcAddressの種類と* nixおよびOS Xの同様のメソッドと混同しないでください)、古いクライアントはそのライブラリにリンクできます。パブリックインターフェイスライブラリが依存するライブラリにリンクできなかった場合でも

10
jdevlin

他の人が使用できるように新しいライブラリを作成したいようで、実装言語としてC + 11を使用したいようです。考慮すべき多くの問題があります:

  • 新しいバージョンのC++を導入することで、ライブラリーと共に新しいC++ランタイムライブラリをデプロイする必要性が生じますが、それで問題ありませんか?
  • notパブリックインターフェイスで新しいC + 11型を使用する必要があります。そうしないと、それらを呼び出すことができません。
  • 一般に、unique_ptrやvectorなどの複雑な型は避けてください。ライブラリをソースコードとして配布している場合を除き、ライブラリ内のオブジェクトのレイアウトは、クライアントコード内のレイアウトとは異なる場合があります。オブジェクトのレイアウトが変化するリスクのない単純なタイプを使用します。
4
Phillip Ngan