Windows システムで Ceres 非線形最適化ライブラリを使用します。 (1) Ceres ライブラリをインストールします。

(1) Ceresライブラリをインストールする

        1. vcpkg を使用して Ceres ライブラリをインストールする

                1.1. vcpkg のインストール

                1.2. セレスのインストール

                1.3. セレスの設定

        2. Virtual Studio を使用して Ceres ライブラリをインストールする

                2.1. ceres-windows のダウンロード

                2.2. ソリューションを開くかアップグレードする

                2.3. プロジェクト libglog_static をコンパイルする

                2.4. プロジェクト ceres_static および ceres をコンパイルする

                2.5. コンパイルルーチン

                2.6. コンパイルとリンクのプロセスについての深い理解

        3. CMake を使用して Ceres ライブラリをインストールする

(2) セレス図書館に電話する

(3) アプリケーションをリリースする

ケレス (英訳: Ceres) は太陽系の準惑星で、1801 年にイタリアの司祭ピアッツィによって初めて観測されましたが、その後ピアッツィは病気のために軌道を失いました。数か月後、ドイツの数学者ガウスは、ピアッツィが以前に観測した 12 個のデータのみに依存し、最小二乗法を使用してケレスの軌道を予測することに成功しました。

200 年以上後、いくつかの複雑な最適化問題 (境界制約のある非線形最小二乗法、一般的な制約のない最適化など) を解決するために、Google は C++ ライブラリ Ceres Solver を開発しました。Ceres Solver と名付けられた理由は、ガウスが最小二乗法を使用して、最適化、統計、天文学の歴史において非常に重要な出来事であるケレスの軌道を予測することに成功したことを記念するためです。

Google 内では、Ceres は、Google ストリート ビューでの車や航空機の姿勢推定、PhotoTours での 3D モデルの構築、SLAM アルゴリズム Cartographer などの複数の製品で使用されています。さらに、Southwest Research Institute のロボットビジョンシステムのキャリブレーション、OpenMVG のビーム調整 (BA) 問題、Willow Garage の SLAM 問題など、一部の企業や研究機関でも Ceres が使用されています。

私は SLAM の専門家で、常に Linux システムに Ceres ライブラリをインストールして使用していますが、適切にインストールするか、ソース コードをダウンロードして CMake でコンパイルするかは、非常に簡単です。ただし、Windows システムに Ceres ライブラリをインストールして使用する必要がある最近のプロジェクトがあり、Windows での Ceres ライブラリのインストールと使用は Linux よりもはるかに複雑であることがわかりました。このブログを書くことは、私が踏んださまざまな穴を記録し、後で他の人に役立つことを期待することです。

 (1) Ceresライブラリをインストールする

Ceres ライブラリをインストールするには、非常に詳細な公式チュートリアル (インストール — Ceres ソルバー) を直接参照することをお勧めします。公式は Windows システムに Ceres ライブラリをインストールする 3 つの方法を提供しています。

  • vcpkg を使用して Ceres ライブラリをインストールします。
  • Virtual Studio を使用して Ceres ライブラリをインストールします。
  • CMake を使用して Ceres ライブラリをインストールします。

vcpkg を使用した Ceres ライブラリのインストールは非常に簡単で、ほぼワンクリックでインストールできますが、欠点は、Ceres のバージョンとその依存関係を手動で選択できないことと、他の一部のコンパイル オプションを変更できないことです。後のアプリケーションでは、編集オプションを変更する必要がありますが、明らかに vcpkg 方式では要件を満たすことができません。Virtual Studio で Ceres ライブラリをインストールするには、Virtual Studio で新しい C++ プロジェクトを作成し、インターネットからダウンロードした Ceres とその依存ソース コードを、新しく作成した C++ プロジェクトの対応する場所に配置し、これらの C++ プロジェクトをコンパイルします。必要な Lib 静的ライブラリと Dll 動的ライブラリを生成します。このようにして、Ceres のバージョンとその依存関係を手動で選択でき、コンパイル オプションを変更することもできます。CMake を使用して Ceres ライブラリをインストールする場合、Virtual Studio を使用して Ceres ライブラリをインストールする場合と比較して、CMake プロジェクトに基づいてコンパイルできるという利点があり、非常に軽量で移植性に優れていますが、欠点は構成プロセスが複雑になることです。は非常に複雑です。したがって、Virtual Studio を使用して Ceres ライブラリをインストールすることをお勧めします。

1. vcpkg を使用して Ceres ライブラリをインストールする

vcpkg は、Microsoft C++ チームによって開発された C および C++ ライブラリ用のクロスプラットフォームのオープン ソース パッケージ マネージャーです。これにより、Windows、Linux、および macOS 上のサードパーティ ライブラリに関連するダウンロードと構成操作が大幅に簡素化されます。現在、1,600 以上のサードパーティ ライブラリが存在します。 -party library ライブラリは vcpkg 経由でインストールできます。vcpkg は実際には、Linux の apt パッケージ マネージャーや Python の pip パッケージ マネージャーに似ています。

1.1. vcpkg のインストール

vcpkg のインストールと使用については、 Windows システムに vcpkg をインストールするための公式チュートリアル ( vcpkg/README_zh_CN.md at master ·microsoft/vcpkg ·GitHub )がすでに非常に詳細に説明されているため、ここでは簡単に説明します。1 つ目は、vcpkg インストール パッケージを Windows コンピューターにダウンロードし、インストール パッケージを実行することです。まず Windows コンピュータに Git クライアントをインストールし、次に Git を使用して vcpkg インストール パッケージをダウンロードします。Git がインストールされていなくても問題ありません。vcpkg の github に直接アクセスしてインストール パッケージをダウンロードしてインストールします。 。

ここでは、Git がすでに存在していることを前提としており、管理者として Windows コンピューターの CMD コマンド ターミナルを直接開き、次のコマンドを入力して vcpkg をインストールします。

> git clone https://github.com/microsoft/vcpkg
> .\vcpkg\bootstrap-vcpkg.bat

1.2. セレスのインストール

引き続き次のコマンドを使用して、CMD コマンド ターミナルに必要な C/C++ ライブラリをインストールします。vcpkg の具体的な使用法については、ヘルプ コマンド vcpkg help を使用してチュートリアルを表示できます。ここでは、まず vcpkg search コマンドを使用して、インストールしたい ceres パッケージの状況をクエリします。

> CD vcpkg\vcpkg
> vcpkg search ceres

 上記のクエリ結果から、vcpkg ウェアハウス内の ceres のバージョンは 2.1.0 ですが、他のバージョンの ceres (ceres[cuda]、ceres[cxsparse] など) が存在します。また、vcpkg のパッケージは 32 ビットと 64 ビットに分かれており、デフォルトでは 32 ビットがインストールされます。このパッケージを 32 ビット アプリケーションと 64 ビット アプリケーションの両方で使用する場合は、両方をインストールする必要があります。

#安装ceres 32位版本的命令
> vcpkg install ceres
#安装ceres 64位版本的命令
> vcpkg install ceres:x64-windows

直接上にインストールされた ceres バージョンは、最適化の反復を実行するときに使用される DENSE_QR ソリューション メソッドです。ceres[cxsparse]、ceres[suitesparse]、ceres[eigensparse] およびその他のバージョンは必要ありません。これらのバージョンがインストールされている場合は、最適化の反復を実行するときに、SuiteSparse または CXSparse の SPARSE_NORMAL_CHOLESKY 解法、または Eigen のスパース コレスキー分解オプションが使用されます。解決すべき問題マトリックスが比較的疎である場合、後者の解決効率は前者よりも明らかに高い。したがって、必要に応じてこれらの必須ではないバージョンをインストールするかどうかを選択できます。インストール方法は次のとおりです。

#安装ceres 32位版本的命令
> vcpkg install ceres[cxsparse] --recurse
> vcpkg install ceres[suitesparse] --recurse
> vcpkg install ceres[eigensparse] --recurse
#安装ceres 64位版本的命令
> vcpkg install ceres[cxsparse]:x64-windows --recurse
> vcpkg install ceres[suitesparse]:x64-windows --recurse
> vcpkg install ceres[eigensparse]:x64-windows --recurse

最後に、インストールが完了した後、vcpkg list コマンドを使用してインストールされたパッケージを表示すると、ceres パッケージがインストールされており、それに対応する依存関係 (Eigen、glog、gflags など) も自動的にインストールされていることがわかります。

 1.3. セレスの設定

上記で Ceres ライブラリがインストールされましたが、Ceres ライブラリを呼び出す C++ プログラムを作成する場合、Ceres ライブラリに関係する include ディレクトリと lib ディレクトリを設定し、プログラム内でいくつかのリンク属性を指定する必要があり、非常に不便です。以下では、いくつかのケースに応じて Ceres を構成する方法について説明します。ここではwin10+VS2022の環境を使用していますが、他のバージョンの環境も同様です。

(1) Visual Studioの非 CMake プロジェクトはCeres ライブラリの構成を使用します

Visual Studio で新しく作成された C++ プロジェクトは、既定では非 CMake プロジェクトです。vcpkg にインストールされているすべてのライブラリを Visual Studio のグローバル スコープに構成できるため、vcpkg にインストールされているライブラリは C/C++ システム標準ライブラリと同様になります。追加の構成を行わずに、Visual Studio の新しい C++ プロジェクトで #include <xxx> によって直接呼び出すことができます。次のコマンドに示すように、vcpkg のライブラリを Visual Studio のグローバル スコープに構成する方法。

#将vcpkg安装到Visual Studio全局范围
> vcpkg integrate install
#将vcpkg从Visual Studio全局范围卸载
> vcpkg integrate remove

場合によっては、異なるプロジェクトで一部のライブラリの異なるバージョンを使用する必要があるため、vcpkg を Visual Studio のグローバル スコープに構成できない場合があります。このとき、vcpkg を nuget にパッケージ化し、Visual Studio の特定のプロジェクトで nuget を介して vcpkg のライブラリを読み込むことができるため、柔軟性が非常に高くなります。vcpkg の対応するライブラリのバージョンがプロジェクトで必要なものではない場合、プロジェクトは vcpkg をロードせずにライブラリを手動でインストールして構成できます。次のコマンドに示すように、vcpkg のライブラリを Visual Studio のローカル スコープに構成する方法。

> vcpkg integrate project

次に、Visual Studio を開き、メニュー バーで [ツール] -> [NuGet パッケージ マネージャー] -> [パッケージ マネージャーの設定] をクリックし、設定インターフェイスで [パッケージ ソース] を見つけて、そこに vcpkg を追加します。名前の欄にさりげなく記入します。ここでは後で使用するときに見つけやすいように vcpkg と記入しました。ソース列に、上記のコマンドの実行後に生成されたファイルのパス (C:\<実際のパスに置き換えます>\vcpkg\vcpkg\scripts\buildsystems など) を入力します。最後に、「OK」をクリックします。

  Visual Studio ソリューションのプロジェクトで vcpkg のパッケージを使用する場合は、次のようにプロジェクトに nuget とともに vcpkg をインストールするだけです。後で必要ない場合は、「アンインストール」をクリックしてください。

 (2) Visual Studioの CMake プロジェクトはCeres ライブラリの構成を使用します

Visual Studio で新しく作成された C++ プロジェクトは、既定では非 CMake プロジェクトです。つまり、この C++ プロジェクトは *.sln または *.vcxproj プロジェクト ファイルに依存しており、Visual Studio 開発環境から分離できないことを意味します。Visual Studio の新しい CMake C++ プロジェクトは、*.sln または *.vcxproj プロジェクト ファイルに依存しないクロスプラットフォーム C++ プロジェクトです。Visual Studio の CMake C++ プロジェクトで Ceres ライブラリを使用する場合は、次のように、プロジェクトの CMake 設定オプションを開き、vcpkg ツールチェーン ファイルのパスを CMake ツールチェーン ファイルに追加します。

[vcpkg root]/scripts/buildsystems/vcpkg.cmake

(3) Visual Studio以外のCMake プロジェクトはCeres ライブラリの構成を使用します

Visual Studio 以外の開発環境の CMake C++ プロジェクトで Ceres ライブラリを使用する場合は、CMake コマンドでプロジェクトをコンパイルするときに、コマンド構成に次のツールチェーン ファイルを使用する必要があります。

> cmake -B [build directory] -S . "-DCMAKE_TOOLCHAIN_FILE=[path to vcpkg]/scripts/buildsystems/vcpkg.cmake"
> cmake --build [build directory]

さらに、CMake では、vcpkg にインストールされているライブラリを使用するには、引き続き find_package を使用する必要があります。

2. Virtual Studio を使用して Ceres ライブラリをインストールする

vcpkg を使用して Ceres ライブラリをインストールするのは簡単ですが、非常に柔軟性に欠けます。したがって、ここではより柔軟な方法を選択し、Virtual Studio で Ceres ライブラリをインストールします。つまり、Virtual Studio で新しい C++ プロジェクトを作成し、インターネットからダウンロードした Ceres とその依存ソース コードを、次に、これらの C++ プロジェクトをコンパイルして、必要な Lib 静的ライブラリと Dll 動的ライブラリを生成します。このようにして、Ceres のバージョンとその依存関係を手動で選択でき、コンパイル オプションを変更することもできます。

2.1. ceres-windows のダウンロード

Virtual Studio で新しい C++ プロジェクトを作成し、Ceres ソース コードを構成してコンパイルする方法がわからない場合は、公式チュートリアルにアクセスして、既製の Virtual Studio プロジェクトをダウンロードできます。ダウンロード アドレスは次のとおりです。

 上記でダウンロードした ceres-windows フォルダーは実際にはテンプレートであり、その中の ceres-solver、Eigen、および glog フォルダーはすべて空であることがわかります。したがって、ceres-solver、Eigen、および glog のソース コードを個別にダウンロードし、それらを ceres-windows の対応するフォルダーに解凍する必要があります。ここでダウンロードしたソースコードのバージョンは次のとおりです。

2.2. ソリューションを開くかアップグレードする

ceres-windows フォルダーに 3 つのソリューション ファイル (ceres-2010.sln、ceres-2012.sln、ceres-2015.sln) があることがわかります。コンピューター上の Virtual Studio のバージョンに対応するソリューションを選択して開きます。Virtual Studio のバージョンがバージョン 2015 より高い場合 (たとえば、Virtual Studio 2022 を使用しています)、ceres-2015.sln ソリューションを直接開き、 [同意する] を押してください。次のプロンプト操作手順により、ソリューション バージョンの自動アップグレードが完了します。

さらに、ソリューションのプロパティに移動し、ソリューションと各プロジェクトの構成 (デバッグ/リリース) とプラットフォーム (x64/Win32) を統合モードに設定することを忘れないでください。これらが統合されていない場合は、後でエラーが報告されます。コンパイル中。ここでは以下のようにReleaseとWin32のモードを一律に設定しました。

 正式にコンパイルを開始する前に、ソリューションのプロパティに移動して、さまざまなプロジェクト間の依存関係を確認できます。

 私たちのソリューションでは、さまざまなプロジェクト間の依存関係を見つけることができます。プロジェクト libglog_static は他のプロジェクトに依存しません。プロジェクト libglog_static は、静的 C++ ライブラリ Lib の作成に使用されるプロジェクトです。プロジェクト ceres_static と ceres はどちらもプロジェクト libglog_static に依存しており、プロジェクト ceres_static は静的 C++ ライブラリ Lib の作成に使用され、プロジェクト ceres は動的 C++ ライブラリ Dll の作成に使用されます。他のプロジェクト (curve_fitting、curve_fitting_c、ellipse_estimated、helloworld、helloworld_analytic_diff、helloworld_numeric_diff、helloworld_static、robust_curve_fitting、simple_bundle_adjuster) は、ceres_static または ceres に依存するルーチンです。具体的な依存関係は次のとおりです。

 プロジェクト間の依存関係に従って、最初にプロジェクト libglog_static をコンパイルし、次にプロジェクト ceres_static と ceres をコンパイルし、最後にルーチン プロジェクト (curve_fitting、curve_fitting_c、ellipse_estimated、helloworld、helloworld_analytic_diff、helloworld_numeric_diff、helloworld_static、robust_curve_fitting、simple_bundle_adjuster) をコンパイルする必要があります。 。

2.3. プロジェクトlibglog_staticをコンパイルする

プロジェクト libglog_static を直接選択し、右クリックしてポップアップ メニュー リストで [生成] を選択すると、コンパイルが開始されます。コンパイルが完了すると、プロジェクトのプロパティで構成された出力パスに従って、コンパイルされた静的ライブラリ ファイル libglog_static.lib がパス "<ソリューション フォルダー>\Win32\Release\" に保存されます。

2.4. プロジェクト ceres _staticおよび ceresをコンパイルする

上記と同様に、プロジェクトを直接選択して右クリックし、ポップアップメニューリストで「生成」を選択するとコンパイルが開始されます。コンパイルが完了した後、プロジェクト プロパティで構成された出力パスに従って、プロジェクト ceres_static および ceres によって生成された静的ライブラリ ファイル ceres_static.lib および動的ライブラリ ファイル ceres.dll は、パス「<ソリューション フォルダー」に保存されたままになります。 >\Win32\リリース\"。この時点で、ルーチンで使用されるライブラリ ファイル libglog_static.lib、ceres_static.lib、および ceres.dll の準備が整います。

2.5. コンパイルルーチン

ソリューション内の他のプロジェクト (curve_fitting、curve_fitting_c、ellipse_estimated、helloworld、helloworld_analytic_diff、helloworld_numeric_diff、helloworld_static、robust_curve_fitting、simple_bundle_adjuster) はすべてルーチンです。つまり、ceres ライブラリをテストするには、ceres ライブラリのコンパイルとインストールを参照してください。これは正しいですか。

(1) ルーチン helloworld をコンパイルします

プロジェクトを直接選択して右クリックし、ポップアップメニューリストで「生成」を選択するとコンパイルが開始されます。ただし、コンパイルでは次のような「C4996」エラーが発生します。

 解決策は、プロジェクトのプロパティ設定、構成プロパティ > C/C++ > プリプロセッサ > プリプロセッサ定義にマクロを追加し、その中に次のマクロを追加することです。

_CRT_NONSTDC_NO_DEPRECATE

コンパイルが成功すると、実行ファイル helloworld.exe が生成されます。プロジェクトのプロパティで構成された出力パスに従って、コンパイルされた実行可能ファイル helloworld.exe はパス "<ソリューション フォルダー>\Win32\Release\" に保存されます。helloworld.exe をダブルクリックしてこのルーチンを実行し、操作の出力を確認します。ただし、プログラムは実行後すぐに終了するため、コンソールが点滅します。このルーチンは、クラッシュすることなく Virtual Studio で実行できます。つまり、Virtual Studio でプロジェクト helloworld を選択し、右クリック > デバッグ > 新しいインスタンスを開始すると、実行結果は次のようになります。

 (2) ルーチン helloworld_static をコンパイルします。

上記のように、コンパイル時に「C4996」エラーが発生します。解決策は、次のようにプロジェクトのプロパティ設定にマクロを追加することです。

_CRT_NONSTDC_NO_DEPRECATE

コンパイルが成功すると、実行ファイル helloworld_static.exe が生成されます。プロジェクトのプロパティで構成された出力パスに従って、コンパイルされた実行可能ファイル helloworld_static.exe はパス "<ソリューション フォルダー>\Win32\Release\" に保存されます。helloworld_static.exe をダブルクリックしてこのルーチンを実行し、操作の出力を確認します。ただし、プログラムは実行後すぐに終了するため、コンソールは点滅します。このルーチンは、クラッシュすることなく Virtual Studio で実行できます。つまり、Virtual Studio でプロジェクト helloworld を選択し、右クリック > デバッグ > 新しいインスタンスを開始すると、実行結果は上記と同じになります。

helloworld と helloworld_static という 2 つのプロジェクトの違いについてお話しましょう。

2.6. コンパイルとリンクのプロセスについての深い理解

自社開発したプログラムをユーザーに提供する際に互換性を高めるために、プログラム開発の段階で注意すべき設定項目は数多くありますが、ここではhelloworldの上記2項目を組み合わせていきます。プログラムのコンパイルプロセスについて詳しく説明するための helloworld_static と、完全なプロセスへのリンク。

(1) 構成とプラットフォームの選択の統一

ソリューションのプロパティに移動し、ソリューションと各プロジェクトの構成 (デバッグ/リリース) とプラットフォーム (x64/Win32) を統合モードに設定することを忘れないでください。統合されていない場合は、後でコンパイルするときにエラーが報告されます。ここでは一律にReleaseモードとWin32モードに設定しました。

実際、Debug 版と Release 版でコンパイルされた *.exe 実行ファイルは正常に動作しますが、Debug 版でコンパイルされたプログラムにはデバッグ関連の処理が追加されるため、Debug 版のプログラム ファイルのサイズは大きくなります。 Debug版の動作効率もReleaseに比べて低くなります。したがって、ソフトウェア プログラムが正式にリリースされるときは、通常は Release バージョンになります。

ただし、x64 と Win32 は、プログラムが実行されているハードウェア プラットフォームに関連しています。コンピューターの CPU には 32 ビットと 64 ビットの 2 種類があり、対応するオペレーティング システムにも 32 ビット オペレーティング システムと 32 ビット オペレーティング システムがあることがわかっています。 64 ビット オペレーティング システム。Win32 は 32 ビット オペレーティング システムに対応し、x64 は 64 ビット オペレーティング システムに対応します。一般に、32 ビット オペレーティング システムでは Win32 プログラムのみを実行でき、64 ビット オペレーティング システムでは x64 プログラムと Win32 プログラムの両方を実行できます。ユーザーにとっては、64 ビット オペレーティング システムを使用する方が互換性が高くなります。プログラム開発者にとっては、Win32 プログラムと互換性のあるマシンが増えています。

(2) ランタイムモードの統一性

マルチスレッド MT によってコンパイルされたファイル サイズは、マルチスレッド MD によってコンパイルされたファイル サイズよりも大きくなります。これは、MT が対応するランタイム ライブラリをコンパイルされた PE ファイルに直接配置するのに対し、MD は実行時にサードパーティ DLL からランタイム ライブラリ自体を取得するためです。は含まれていません。マルチスレッド MT でコンパイルされたファイルは、実行時にサードパーティ DLL をロードする必要がないため、マルチスレッド MD よりも実行効率がわずかに高くなります。 。

現在、市販されているソフトウェアのほとんどはマルチスレッドMD方式を採用しており、コンパイルされるファイルは小さく、すべてのランタイムライブラリが統一されており、メモリ管理も簡素化されており、モジュール間のメモリアクセスに起因するさまざまなバグが排除されています。現在、市販されているソフトウェアのほとんどはマルチスレッドMD方式を採用しており、コンパイルされるファイルは小さく、すべてのランタイムライブラリが統一されており、メモリ管理も簡素化されており、モジュール間のメモリアクセスに起因するさまざまなバグが排除されています。

プロジェクトのプロパティ ウィンドウで構成プロパティを選択し、C++ オプションのコード生成マルチスレッド デバッグ DLL (/MDd) とマルチスレッド デバッグ DLL (/MTd) がデバッグ バージョン、後ろに d のないものがリリース バージョンです。マルチスレッド MT は、C 言語バージョンに属する静的ランタイム ライブラリをロードします。マルチスレッド MD バージョンは、Microsoft バージョンに属するダイナミック ランタイム ライブラリをロードします。どのランタイム モードを選択しても、プロジェクトとその依存ライブラリ プロジェクトのモードは統一する必要があります。たとえば、プロジェクト helloworld のモードが MD の場合、その依存ライブラリ ceres および libglog_static のモードも MD である必要があります。特別な場合はなく、一律にデフォルト モードの MD を使用します。

(3) ダイナミックライブラリとスタティックライブラリ

静的ライブラリの場合、関数とデータはバイナリ ファイル (通常は .lib 拡張子付き) にコンパイルされます。静的ライブラリの場合、実行可能ファイルがコンパイルされてリンクされると、リンカーはこれらの関数とデータをライブラリからコピーし、それらをアプリケーションの他のモジュールと結合して、最終的な実行可能ファイル (.exe ファイル) を作成します。製品を配布する場合、使用される静的ライブラリではなく、実行可能ファイルのみを配布する必要があります。

ダイナミック ライブラリを使用する場合、多くの場合、コンパイル後にインポート ライブラリ (.lib) ファイル (「インポート ライブラリ ファイル」とも呼ばれます) と DLL (.dll) ファイルの 2 つのファイルが提供されます。もちろん、DLL ファイルが 1 つだけ提供されていれば、ディスプレイ接続メソッドを使用して呼び出すこともできることは後で説明しますが、ちょっと面倒です。インポートされたライブラリのサフィックス名も「lib」ですが、ダイナミック ライブラリのインポート ライブラリ ファイルと静的ライブラリ ファイルの間には本質的な違いがあります。DLL ファイルの場合、そのインポート ライブラリ ファイル (.lib) には、DLL によってエクスポートされた関数と変数のシンボリック名が含まれており、.dll ファイルには DLL の実際の関数とデータが含まれています。ダイナミックライブラリを使用する場合、実行可能ファイルをコンパイルおよびリンクする際には、DLLのインポートライブラリファイルのみをリンクする必要があり、実行可能プログラムが実行されるまで、DLL内の関数コードおよびデータを実行可能ファイルにコピーすることはできません。必要な DLL をロードするには、その DLL をプロセスのアドレス空間にマップし、DLL 内のエクスポートされた関数にアクセスします。このとき、製品をリリースする際には、実行ファイルのリリースに加えて、プログラムから呼び出されるダイナミックリンクライブラリもリリースする必要があります。

スタティック リンク ライブラリとダイナミック リンク ライブラリは両方ともコードを共有します。スタティック リンク ライブラリを使用する場合、lib スタティック ライブラリ内のすべての命令は、最終的に生成される exe ファイルに直接含まれます。ただし、DLL ダイナミック ライブラリを使用すると、最終的な exe ファイルに DLL を含める必要はなく、exe ファイルの実行時に、exe とは独立した DLL ファイルを「動的」に参照してアンインストールできます。スタティック リンク ライブラリとダイナミック リンク ライブラリのもう 1 つの違いは、スタティック リンク ライブラリには他のダイナミック リンク ライブラリまたはスタティック ライブラリを含めることができず、ダイナミック リンク ライブラリには他のダイナミック リンク ライブラリまたはスタティック リンク ライブラリを含めることもできることです。

前のルーチン プロジェクト helloworld と helloworld_static は、ダイナミック ライブラリとスタティック ライブラリのリンク プロセスを説明するために使用されます。まず、スタティック ライブラリ libglog_static.lib は、スタティック ライブラリ ceres_static.lib とダイナミック ライブラリ ceres.dll にそれぞれ静的にリンクされます。つまり、ceres_static.lib と ceres.dll の両方に libglog_static.lib のすべての内容が含まれており、ceres_static.lib と ceres.dll ライブラリをリリースするときに libglog_static.lib は必要なくなります。静的ライブラリ ceres_static.lib はアプリケーション プログラム helloworld_static.exe に静的にリンクされており、helloworld_static.exe には ceres_static.lib のすべての内容が既に含まれているため、プログラムのリリース時に顧客に helloworld_static.exe をコピーするだけで済みます。 。ダイナミック ライブラリ ceres.dll は、アプリケーション プログラム helloworld.exe に動的にリンクされます。つまり、helloworld.exe の実行中に、動的に ceres.dll にリンクされるため、プログラムをリリースするときに、helloworld をリンクする必要があります。 exe と ceres.dll を一緒にクライアントにコピーします。helloworld.exe のみをクライアントにコピーすると、プログラムの実行中に ceres.dll が見つからないというエラーがプログラムによって報告されます。

(4) システムレベルのランタイムサポート

上で説明した状況では、静的ライブラリ lib、動的ライブラリ dll、およびアプリケーション プログラム exe は実際にはすべてシステム レベルのランタイム (RunTime) サポートに依存します。Windows システム上で実行される C++ プログラムの場合、システムの C++ ランタイム ライブラリ (Microsoft Virtual C++) に依存します。また、Windows システム上で実行される .NET ベースのプログラム (WPF、Winform など) は、システムの .NET ランタイム ライブラリ (.NET Framework) に依存する必要があります。

上で説明したプログラムはすべて C++ プログラムであるため、ここでは主に Windows システムの C++ ランタイム ライブラリについて説明します。私が個人的にテストしたところ、win7 であっても win10 であっても、システムのインストール後、またはシステムの自動更新後に、以下に示すように C++ ランタイム ライブラリ (Microsoft Virtual C++) が自動的にインストールされます。

まず最初に、Virtual C++ には多くのバージョンがあり、上位バージョンには必ずしも下位互換性があるわけではないことを知っておく必要があります (たとえば、プログラムが Virtual C++ 2010 に依存している場合、Virtual C++ 2010 のみを使用している場合、コンピューターは実行できない可能性があります)。 C++ 2012 がインストールされています)。したがって、現在サポートされている Virtual C++ のすべてのバージョン (2005/2008/2010/2012/2013/2015-2022 を含む) が通常コンピュータにインストールされ、2015-2022 バージョンには 2015 以降のバージョンが含まれます。また、Virtual C++ のバージョンは 32 ビット (x86) と (x64) に分かれており、64 ビット Windows システムでは、Virtual C++ の x86 バージョンと x64 バージョンの両方がインストールされますが、32 ビット Windows システムでは、Virtual C++ の x86 バージョンと x64 バージョンの両方がインストールされます。の場合、仮想 C++ の x86 バージョンのみがインストールされます。

特殊なケースでは、一部のコンピューターに Virtual C++ がインストールされていないか、Virtual C++ のバージョンが不完全である場合があります。その後、お客様に送信するプログラム (helloworld_static.exe、helloworld.exe+ceres.dll など) が、MSVCP140.dll が見つからないという次のようなエラーを報告する場合があります。

最も直接的な解決策は、対応するバージョンの Virtual C++ をダウンロードしてコンピュータにインストールすることです。一般に、この C++ プログラムの開発には Virtual Studio 開発環境のどのバージョンを使用しますか。その場合、この C++ プログラムは、このバージョンの Virtual Studio に統合された Virtual C++ に基づいています。プロジェクトのプロパティ ページに移動して、プラットフォーム ツールセットの特定のバージョンを表示できます。Virtual Studio の各バージョンに対応するツールセットのバージョン番号は次のとおりです。

-Visual Studio 2022: V143

-Visual Studio 2019: V142

-Visual Studio 2017: V141

-Visual Studio 2015: V140

-Visual Studio 2013: V120

-Visual Studio 2012: V110

-Visual Studio 2010: V100

-Visual Studio 2008: V90

-Visual Studio 2005: V80

-Visual Studio 2003: V71

-Visual Studio 2002: V70

-ビジュアルスタジオ6:V60

 不足している Virtual C++ のバージョンがわからない場合は、すべての Virtual C++ バージョンをインストールしてください。Virtual C++ インストール パッケージは、Microsoft の公式 Web サイト (最新のサポートされている Visual C++ 再頒布可能ダウンロード | Microsoft Learn )からダウンロードできます。インストール パッケージは VC_redist 実行可能ファイルです。実行後、対応するバージョンの Virtual C++ がオンラインでインストールされます。Virtual C++ の各バージョンを 1 つずつ手動でダウンロードするのが面倒な場合は、ここ ( Microsoft Visual C++ 再頒布可能パッケージ (すべてのバージョン) のダウンロード) にアクセスして、Virtual C++ のすべてのバージョンをパッケージ化してダウンロードできます。

しかし、テクノロジを理解していない一般ユーザーにとって、仮想 C++ を手動でインストールするのは複雑すぎます。ユーザーがこれらの依存関係を手動でインストールするのは現実的ではないため、C++ プログラムが MFC や ATL などの追加ライブラリに依存する場合があります。実際、プロジェクトをコンパイルするときに、プロパティ ページの [C++ ランタイムを出力ディレクトリにコピー] を [はい] に設定できます。

  プロジェクトをコンパイルすると、自分で作成した exe ファイルと dll ファイルが生成されるだけでなく、多数のシステムレベルの dll ファイルもコンパイル出力ディレクトリに生成されます。これらすべてのシステム レベルの DLL と独自の exe および DLL ファイルをお客様にコピーするだけでよく、お客様側のコンピュータでは、システム レベルのランタイム環境がインストールされているかどうかに関係なく、プログラムを通常どおり使用できます。

 3. CMake を使用して Ceres ライブラリをインストールする

開発に Virtual Studio 開発環境を使用しない場合は、CMake を使用して Ceres とそれに依存するソース コードを段階的に手動で構成およびコンパイルする必要があります。具体的な手順は比較的面倒なので、Ceres の公式チュートリアルに直接アクセスしましょう。

インストール — Ceres ソルバー

参考文献

[1] Zhang Hu、ロボット SLAM ナビゲーションのコア技術と実践 [M]、Machinery Industry Press、2022 年。

おすすめ

転載: blog.csdn.net/m0_68732180/article/details/130233901