1

過去4か月間、OpenCVやOpenSceneGraphなどのサードパーティライブラリを使い始めましたが、いくつかの基本的な質問があります...

1.)関数を使用すると、プログラムで言及したlibファイル(関数を含む)(たとえば、-lcv.lib、-lhighgui.lib)は、binフォルダーにあるそれぞれの.dllファイルを呼び出しますか?この呼び出しは実行時に行われますか?

2.)CMAKE、MAKE、およびVisual Studio Solutionファイルを使用したソースコードからのlibファイルとdllファイルの静的ビルドと動的ビルドの違いは何ですか?

3.)実行可能コードのサイズを減らすためだけに.dllを使用する利点はありますか?

4.)組み込みビジョンアプリケーション(またはライブラリを使用する組み込みアプリケーション)では、実行可能コード全体がプロセッサ/コントローラ/チップにダンプされますか?組み込みアプリケーションでの遅延バインディングまたはランタイム呼び出しの概念はありますか?

私が使用しているコード内で何が起こっているのかを理解できるように、これらの質問にいくつかの洞察を与えてください...事前に感謝します...

4

4 に答える 4

2

1.)関数を使用すると、プログラムで言及したlibファイル(関数を含む)(たとえば、-lcv.lib、-lhighgui.lib)は、binフォルダーにあるそれぞれの.dllファイルを呼び出しますか?この呼び出しは実行時に行われますか?

はい、ライブラリには、exeでアドレス指定された関数を解決できるようにするためのリンカーの情報のみが含まれています。実際のコードは実行時にロードされます。

2.)CMAKE、MAKE、およびVisual Studio Solutionファイルを使用したソースコードからのlibファイルとdllファイルの静的ビルドと動的ビルドの違いは何ですか?

なし、ビジュアルスタジオはそれをもう少し便利にします(主観的に)。

3.)実行可能コードのサイズを減らすためだけに.dllを使用する利点はありますか?

exeを再作成せずにdllの内容を変更することは可能です(以前のバージョンと互換性がある場合、たとえばインターフェイスは変更されていません)。

後でライブラリを遅延ロードすることもできます(つまり、.libファイルとリンクせず、代わりにLoadLibrary / GetProcAddressを使用します)。したがって、dllにオプションの機能があり、それが存在する場合は有効になりますが、 dllが見つかりません。

4.)組み込みビジョンアプリケーション(またはライブラリを使用する組み込みアプリケーション)では、実行可能コード全体がプロセッサ/コントローラ/チップにダンプされますか?組み込みアプリケーションでの遅延バインディングまたはランタイム呼び出しの概念はありますか?

これはOSによって異なりますが、多くの場合(少なくともこれまで関わってきた組み込みプロジェクトでは)、組み込みデバイスのOSが共有ライブラリをサポートしていないため、静的ライブラリが使用されます。OSがそれをサポートしている場合は問題ありませんが、多くの場合、組み込みデバイスのハードウェア/ソフトウェアは非常に限られています。

于 2012-08-23T05:22:06.163 に答える
1

dllは、アプリケーションの開始時にデフォルトでロードされますが、手動でdllをロードするように変更できます(どのように機能したか覚えていないが、少し退屈です)。静的ビルドとは、必要なすべてのopencv関数が.exeファイルにあり、マシンのどこかにないことを意味します。

通常、実行しているプログラムは1つだけなので、実際の組み込みアプリケーションでは静的リンクを使用する方がよいと思います。あなたのマシンにはopencvを使用する20のプログラムがあるので、それらにdllを動的にロードさせると、マシンのメモリを大幅に節約できます。opencvは3か月ごとにバージョンが変更されるため、静的リンクとしてopencvを配布する方がよいと思います。大きなプログラムの場合、それはより理にかなっています。

于 2012-08-22T14:51:01.577 に答える
1

コードは、すべてのモジュールをそれ自体にコピーする単一の巨大な実行可能ファイルとしてコンパイルすることも、DLLまたは共有ライブラリの形式で動的にロード可能なモジュールの小さな実行可能ファイルとセットにコンパイルすることもできます。共有ライブラリ/DLLは、実行可能コードをモジュール化して保守可能にし、実行可能コードの再利用を可能にするため、実行可能ファイルのサイズをよりスリムにします。メインの実行可能ファイルに触れることなく、動的モジュールに独立して簡単に修正を送信できます。また、多くの実行可能ファイルは、実行時に同じDLL /共有ライブラリを共有およびロードできるため、再利用が可能になり、ディスク領域の要件が軽減されます。

これで、動的モジュールは、動的モジュール自体として再度出荷される可能性のある他のサードパーティライブラリを使用する場合があります。これは、動的モジュールが参照されるたびに、システムが依存するモジュールを見つけて解決しようとすることを意味します。したがって、これは依存関係の解決のチェーンです。

私が理解しているように、組み込みシステムは小さな組み込みオペレーティングシステムを使用しています。OSが参照できるある種のメモリにアプリケーションを出荷することができます。組み込みシステムの高度さのレベルに応じて、プラグイン可能なディスクドライブや組み込みメモリデバイスなどが考えられます。OSが共有モジュールの動的ロードをサポートしている場合は、もちろん、アプリケーションを実行可能モジュールと動的モジュールのセットとして出荷できます。

于 2012-08-22T15:16:57.650 に答える
1

はい、重要なのは、実行可能ファイルに同じライブラリのコピーが組み込まれている100個のアプリケーションがないように重複を排除することです。理論的には、これにより、100個のアプリケーションを更新するのではなく、ライブラリの更新を1か所で行うこともできます。

ダイナミックリンクは、オペレーティングシステムでサポートされている機能です。したがって、答えは、組み込みシステムで実行しているOSによって異なります。多くの組み込みターゲットはLinuxを実行しているため、その場合はPCとまったく同じ動作になります。

マイクロコントローラで一般的な小さなOSは、通常、ダイナミックリンクをサポートしません。

于 2012-08-22T14:50:27.633 に答える