1

メインソリューションにリンクされているDLLをターゲットにしたライブラリを構築しています。

この新しいDLLは非常に複雑で、C ++ 11の機能を利用したいのですが、それをリンクするプログラムは確実に利用しません。実際、メインプログラムは現在、VS2008とVS2010を使用して「クリーンに」構築されています(Linux用のGCC 4.3だと思いますか?)。

私が提案するもの:

VS2012をIDEとして使用し、IntelC++コンパイラ2013を使用して.dll/.so(Linuxの場合)にコンパイルします。これは、私が理解しているように、基本的にマシン形式(.exeなど)に依存します。

私はC++を使用して問題を解決することに精通していますが、コンパイル/リンクなどの基本に精通していません。したがって、コミュニティに質問したいと思います。

  1. これは可能です
  2. 可能であれば、それはどれほど簡単ですか(私が説明したように単純ですか?)/途中でどのような落とし穴や問題が予想されますか(それは価値がありますか)?

私が予想する懸念事項:

  • ランタイムライブラリ-これがこの取り組みを妨げる要因になると思います。問題になるかもしれないことを除いて、私はそれらについて/それらがどのように機能するかについて何も知りません。
  • 標準ライブラリの実装の違い-DLL形式であるかどうかは重要ですか?
  • スレッドの競合-dllスレッドとメインプログラムスレッドが同じデータを変更することはなく、実際にはメインプログラムのスレッドの1つがDLL関数を呼び出します。

ボーナス:上記は私がとることを期待しているルートですが、理想的には、このコードをインテリセンス、一般的な表示などのために開いておく必要があります(基本的にはメインソリューションのプロジェクトになるためです)。別のランタイムライブラリ/コンパイラを指定する方法はありますか?これはできますか?

編集:このボーナス部分の主な理由は、メインプログラムとこのライブラリが別々に構築されている場合に発生する必要な「バージョン管理」の競合を排除することです。

注:私は新しいためだけにC ++ 11を使用していません-強く型付けされた列挙型とクロスプラットフォームのスレッデッドコードは、ライブラリにとって大きなボーナスになります。

4

2 に答える 2

2

問題は、「アプリケーションが別のコンパイラで構築されたライブラリを使用できるか」ということではありません。(答えは「はい」です。)しかし、「別のコンパイラとC++標準ライブラリで構築されたライブラリのパブリックインターフェイスで使用できるC++機能は何ですか?」

Windowsでは、答えは「ほとんどなし」です。インターフェイス(仮想関数のみを含むクラス)はそれに関するものです。データメンバーを持つクラスはありません。例外なし。ランタイムオブジェクト(iostreamインスタンスや文字列など)はありません。テンプレートはありません。

Linuxでは、答えは「もっとたくさんありますが、まだ多くはありません」です。ODRが満たされている限り、クラスは問題ありません。例外は機能します。テンプレートも、定義が両側でまったく同じである限り。std::stringただし、標準ライブラリタイプの定義はC++03とC++11の間で変更されたため、たとえば、アプリケーションとライブラリの間でオブジェクトを渡すことはできませんstd::vector<int>(どちらもこれらの機能を使用できますが、同じオブジェクトを使用できます)。クロスオーバーしないでください)。

于 2012-11-14T21:12:43.893 に答える
1

これはC++では不可能だと思います。特に名前マングリングは異なる場合があります。一緒にリンクされたすべてのC++ファイルは、同じコンパイラでコンパイルする必要があります。

C ++では、extern "C"ものは標準(命名、呼び出し規約)であるため、CライブラリはC ++から呼び出すことができ、C++関数はextern "C"ブロックで宣言されます。これは、クラス、テンプレート、オーバーロードを除外し、異なるコンパイラーによってコンパイルされたそれらを混合することは機能しません。

これは残念です。

于 2012-11-14T21:02:41.330 に答える