次の記事をマージして、さまざまなバージョンの OPENCV でコードを実行するための解決策を考え出しました。
- マクロから文字列を作成する方法
- マクロでの文字列の連結
- MSDN の VS2008をサポートする #defines のプラグマ ステートメント
- おまけ:ソリューションでグローバル設定を定義する方法
前述のように、互換性のないバージョン間でポップした場合、これは深刻な問題を引き起こす可能性がありますが、サポートされているバージョンと機能については、これが役立つ場合があります. この手法を使用して、opencv のバージョンを一度設定すると、コードが目的のバージョンに自動的にリンクされます。
ソースコードの 1 か所で OPENCV_VERSION を定義する
- プロパティ シートで定義する
- システム環境変数で定義します。
私のコードは次のようになりました:
#include <iostream>
// #define OPENCV_VERSION $(OPENCV_VERSION)
// #define OPENCV_VERSION 220
#define QUOTE(name) #name
#define STR(macro) QUOTE(macro)
#define LINK_TO_OPENCV(libname) __pragma(comment(lib, "opencv_" #libname STR(OPENCV_VERSION)))
#define LINK_TO_OPENCV_DEBUG(libname) __pragma(comment(lib, "opencv_" #libname STR(OPENCV_VERSION) "d"))
#ifndef NDEBUG
LINK_TO_OPENCV_DEBUG("core")
LINK_TO_OPENCV_DEBUG("highgui")
LINK_TO_OPENCV_DEBUG("imgproc")
#else
LINK_TO_OPENCV("core")
LINK_TO_OPENCV("highgui")
LINK_TO_OPENCV("imgproc")
#endif
int main()
{
std::cout << STR(LINK_TO_OPENCV("core")) << "\n";
return 0;
}
次に、OPENCV_VERSION を好きな場所に設定します。たとえば、次の行を持つすべてのユーザーが単一のヘッダー ファイルを含めることができます。
#define OPENCV_VERSION 220
または、Project->Properties->C/C++->Preprocessor に移動して、Preprocessor Definitions を OPENCV_VERSION=220 に設定することもできます。または、ソリューション全体の共有プロパティ シートで同じことを行うこともできます。
または、これは重要です。この手法を使用して、Windows 自体で OPENCV_VERSION_ENV というグローバル環境変数を定義し、その値をバージョン コード (たとえば 220) に設定できます。次に、プリプロセッサ定義を設定してOPENCV_VERSION=$(OPENCV_VERSION_ENV)
、環境変数をリンク コマンドに取り込みます。できません#define OPEN_VERSION $(OPENCV_VERSION_ENV)
が、プロパティ ページは $(macro) を自動的に変換するため、そこで環境変数を取得できます。