2012-08-27 20 views
9

私はパフォーマンスが重要なので、最適化アルゴリズムに取り組んでいます。アルゴリズムは、VS 2008と比較してVS 2010でコンパイルすると約8倍高速です。グーグルでは、それは自分の責任ではないことを示しています(たとえばhttps://stackoverflow.com/a/5560184/890355を参照)。問題は、最終プロジェクトをVS 2008で構築する必要があることです。VC++ 2008プロジェクトでVC++ 2010ランタイムライブラリを使用

解決策は、私のアルゴリズムをVS 2010でDLLとして構築し、それをメインプロジェクトにリンクすることです。 VS 2008の下で私のDLLでVC++ 2010ランタイムライブラリを使用することは可能ですか?もしそうなら、それを行うには、最も痛い方法は何ですか? 他のアイデアはありますか?おかげさまで

+0

C++コンパイラは、C++ 0xのをサポートしていません。もちろん、Visual Studio 2010やVisual Studio 2012へのアップグレードを避けたい場合は、常に最新のコンパイラを使用することができます。可能な解決策の1つは、別のコンパイラを使用して最適化アルゴリズム自体をコンパイルし、 。 –

+2

ライブラリ同士がオブジェクトを渡し、互いのオブジェクトの割り当てを解除することを期待していますか?ライブラリのミキシングはうまくいくかもしれませんが、かなり制限があります(C++コンテナを使用すると悪い魔法につながる可能性があります):http://stackoverflow.com/questions/6531401/how-to-use-vs2010-built-dlls-in -vs2008 - 要約すると、すべてを一貫性を保ち、1つのC++ランタイムしか使用できない場合は簡単です。 – birryree

+3

これは、VS2010の#includeファイルを使用するときにのみ有効です。どちらが動作しません、VS2008は、特にあなたが移動セマンティクスの性能向上の後になっているので、それらをコンパイルすることはできません。 –

答えて

1

2008年と2010年のライブラリを1つの実行可能ファイルに結合する方法を他の方法で求めているのであれば、 "これを達成する他の簡単な方法はありません"。

しかし、あなたの2008年に "2010年にコンパイルされたDLLを使用する"(しかし、2008年のIDEで2010年のライブラリをビルドしている) "VS 2008 2010年のランタイムライブラリ..." - コンパイルされたプログラム "、それは完全に可能です。

最も簡単な方法は、静的にリンクされた標準ライブラリ(使用する場合はMFC)に対して(.exeとDLLの両方を)ビルドし、次に.exeにLoadLibraryを使用してDLL。 DLLでは、()関数を(好ましくはextern "C" {}ガード内に)エクスポートし、GetProcAddressまで.exeで使用できます。

静的リンケージと明示的ロードは、異なるランタイムによって引き起こされる多くの不一致バグを防ぎます。

DLLの読み込みと関数呼び出しのコストが気になる場合は、これらの呼び出しをできるだけ稀に行うことができます(おそらく、アルゴリズムだけでなく、より高度なロジックをDLLに移すこともできます)。 this issieも参照してください。

native multitargetingを使用して1つのIDE(2010)ですべてのコードをビルドすることができます(ただし、メインのアプリとDLLはそれぞれv9とv10のライブラリとは別にビルドする必要があります)。

3

ランタイムは問題になりません。何もあなたのDLLをVC2010ランタイムに対してリンクしてから、そのDLLを他のプロジェクトで使用することを止めません。それらのプロジェクトがVisual C++ 2008または他の言語を使用して構築されているかどうかは関係ありません。

難しい部分は、DLLインターフェイスを設計することです。単純にいくつかのC++クラスをエクスポートすることは、異なるコンパイラ間の非互換性をもたらすため、危険です。私はあなたの最善の策は、Cスタイルのインターフェイスを公開するか、COMを使うことだと思います。私はCOMが最善の方法だと思っていますが、あなたがこの技術に精通していないなら、Cスタイルのインターフェースはうまく動作します。 (インターフェイスがシンプルであれば、COMもオーバーキルする可能性があります)

関連する問題