C++/CX を使用して Windows 8 ストア アプリ内の画像処理にOpenCVライブラリを使用しようとしています。Visual C++ 2012 を使用して OpenCV ライブラリをビルドできますが、アプリをパッケージ化してWindows アプリ認定キットを実行すると、OpenCV DLL がサポートされていない Windows API を使用しているというエラーがいくつか表示されます。これらのエラーを修正するにはどうすればよいですか?
4 に答える
ARM 用の OpenCV のサブセットを構築することができました。
まず、x86 で Windows ストア アプリケーション用にビルドすることに関心のあるサブセットを取得しました。CMake で OpenCV のソース ダウンロードを指定した後、Visual Studio 11 ジェネレーターを使用して x86 プロジェクトを構成しました。CMake 内に TARGET_METRO という新しいビルド オプションを追加し、これを使用して他のプロジェクトをさらに構成しました。
これにより、ビルドしたくないいくつかのサードパーティ コンポーネントをオフにすることができました。
OCV_OPTION(BUILD_PERF_TESTS "Build performance tests" ON IF (NOT IOS AND NOT TARGET_METRO) )
この方法で、WITH_VIDEOINPUT、BUILD_PERF_TESTS、および BUILD_TESTS をオフにしました。TARGET_METRO がオンのときに Raman が言及した定義も追加しました。
if(TARGET_METRO)
add_definitions(-DWINAPI_FAMILY=WINAPI_FAMILY_APP)
add_definitions(-D_UNICODE)
endif()
次に、CMake を使用してプロジェクトの x86 (Visual Studio 11) バージョンを生成し、プロジェクトのビルドを試みました。多くの問題が発生しますが、そのほとんどは WinRT に API がないことに関連しています。これらのほとんどは機械的な変更です (たとえば、 への交換InitializeCriticalSection
) InitializeCriticalSectionEx
。#if WINAPI_FAMILY == WINAPI_FAMILY_APP
非 TARGET_METRO ビルドに影響を与えないように、これらの変更をラップしました。
ARM 用にビルドするときが来たら、CMake を起動し、Visual Studio 11 ジェネレーターを使用して (「ARM」という名前のディレクトリの下に) 新しいプロジェクトを生成し、結果のプロジェクト ファイルを手動で編集し始めました。
必要な主な変更は次のとおりです。
- すべての vcxproj ファイルですべての 'Win32' を 'ARM' に変更します (3rdparty\IlmImf には 'Win32' を含むファイル名が含まれています。これらのインスタンスを元に戻すように注意してください)。
- すべてのプロジェクトについて
<AppContainerApplication>true</AppContainerApplication>
、Globals プロパティ グループに追加します。 - ZERO_CHECK プロジェクトの場合、ConfigurationType を「Utility」ではなく「DynamicLibrary」に変更します (Utility タイプはビルドに失敗するため)。
プロジェクト レベルで以下を追加します (ARM 用にビルドするプロジェクトごとに)。
<ItemDefinitionGroup> <ClCompile> <CompileAsWinRT>false</CompileAsWinRT> </ClCompile> <Link> <SubSystem>Console</SubSystem> <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries> <GenerateWindowsMetadata>false</GenerateWindowsMetadata> </Link> </ItemDefinitionGroup>
「/machine:X86」をリンクから削除: 追加オプション (そこにある場合)
- 追加の依存関係から gdi32.lib、winspool.lib、shell32.lib、および comdlg32.lib を削除します (これらのライブラリは ARM には存在しません)。
OpenCV は CMake を使用してそのソースをビルドします。OpenCV ソースをダウンロードしたら、ルート フォルダーでファイル CMakeLists.txt を編集して、次の 2 行を含めます。
add_definitions(-DWINAPI_FAMILY=WINAPI_FAMILY_APP) add_definitions(-D_UNICODE)
次の #if ブロックで:
if(WIN32 かつ MINGW ではない)
これにより、ライブラリは、Windows ストア アプリでサポートされている API にのみアクセスできるようになります。これは、いくつかのビルド エラーを修正する必要があることを意味する可能性があります (私が先週試したときはそれほど多くはありませんでした) が、最終的にバイナリは WACK クリーンになります。
ただし、上記の手順は、OpenCV の x86 および x64 ビルドでのみ成功します。OpenCV で使用される CMake ツールは、ARM アーキテクチャ用の Visual C++ 2012 プロジェクトをまだサポートしていません。この問題は、このバグによって追跡されています。
アップデート
Windows ストア アプリと電話アプリ (8.0 と 8.1 の両方) のビルドをサポートする CMake のポートが追加されました。ここで詳細を参照してください: http://cmakems.codeplex.com/
2 回目の更新
以下のビデオは、C++ を使用して記述された Windows 10 ユニバーサル アプリでの OpenCV の動作を示しています: http://channel9.msdn.com/Events/Build/2015/3-82