質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

CMake

CMakeはクロスプラットフォームで作動するオープンソースのビルドシステムです。コマンドライン又は組み込まれた開発環境で使うことができる元のmakefileとプロジェクトファイルを生成します。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Q&A

解決済

1回答

2441閲覧

OpenCV3.4.1をVisualStudio2015で作成したx86環境向けMFCアプリで使用したい

notgoodpg

総合スコア37

MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

CMake

CMakeはクロスプラットフォームで作動するオープンソースのビルドシステムです。コマンドライン又は組み込まれた開発環境で使うことができる元のmakefileとプロジェクトファイルを生成します。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

0グッド

0クリップ

投稿2018/12/27 05:01

編集2018/12/28 00:06

前提・実現したいこと

OpenCVの機能を利用したMFCアプリをx86環境向けに作成する必要があり開発をしようとしています。

コンパイルでリンカエラーが発生し行き詰っています。

(安定版として最新であるらしいため)OpenCV3.4.1を使用しています。
OpenCV3.4.1のインストーラではx64用APIのみなのでCMakeを利用した方法を調べて実行しました。
CMakeを利用してOpenCVのソリューションを作成しVisualStudio2015でビルドするところまでは行えました。

発生している問題・エラーメッセージ

しかし新しくソリューションを作成してOpenCVを用いたサンプルを試しに動かそうとしてDebug構成でビルドを実行するとリンカエラーが発生します。

エラーを以下に列挙します

エラー LNK2019 未解決の外部シンボル "void __cdecl cv::fastFree(void *)" (?fastFree@cv@@YAXPAX@Z) が関数 "public: __thiscall cv::Mat::~Mat(void)" (??1Mat@cv@@QAE@XZ) で参照されました。
エラー LNK1120 5 件の未解決の外部参照
エラー LNK2001 外部シンボル ""private: void __thiscall cv::String::deallocate(void)" (?deallocate@String@cv@@AAEXXZ)" は未解決です。
エラー LNK2019 未解決の外部シンボル "class cv::Mat __cdecl cv::imread(class cv::String const &,int)" (?imread@cv@@YA?AVMat@1@ABVString@1@H@Z) が関数 "public: void __thiscall CExperimentOpenCVDlg::OnBnClickedOk(void)" (?OnBnClickedOk@CExperimentOpenCVDlg@@QAEXXZ) で参照されました。
エラー LNK2019 未解決の外部シンボル "private: char * __thiscall cv::String::allocate(unsigned int)" (?allocate@String@cv@@AAEPADI@Z) が関数 "public: __thiscall cv::String::String(char const *)" (??0String@cv@@QAE@PBD@Z) で参照されました。
エラー LNK2019 未解決の外部シンボル "private: void __thiscall cv::String::deallocate(void)" (?deallocate@String@cv@@AAEXXZ) が関数 "public: __thiscall cv::String::~String(void)" (??1String@cv@@QAE@XZ) で参照されました。
エラー LNK2019 未解決の外部シンボル "public: void __thiscall cv::Mat::deallocate(void)" (?deallocate@Mat@cv@@QAEXXZ) が関数 "public: void __thiscall cv::Mat::release(void)" (?release@Mat@cv@@QAEXXZ) で参照されました。

OpenCV3.4.1のバージョンではx86アプリケーションで利用は不可能になっているのでしょうか。
その場合VisualStudio2015で開発したx86MFCアプリケーションで利用可能なOpenCVのバージョンが知りたいです。
または、利用可能だが設定すべき項目があるならばご指摘いただけたら幸いです。
よろしくお願いいたします。

該当のソースコード

c++

1void CExperimentOpenCVDlg::OnBnClickedOk() 2{ 3 // TODO: ここにコントロール通知ハンドラー コードを追加します。 4 cv::imread("hoge.jpg");//リンカエラーなのでimreadを呼んだだけでもコケる 5 6 //CDialogEx::OnOK(); 7} 8

問題を解決するコード

c++

1#ifdef DEBUG 2#pragma comment(lib,"opencv2\opencv_imgcodecs341d.dll") 3#else 4#pragma comment(lib,"opencv2\opencv_imgcodecs341.dll") 5#endif

試したこと

OpenCVのライブラリの生成がうまくいっていないのかと思い
%OpenCV.slnのあるフォルダ%\install\x86\vc14\libを参照してみました
34ファイルほどlibファイルが生成されていましたが結局何が不足しているのかわからないためあまり意味はありませんでした。

補足情報(FW/ツールのバージョンなど)

  • Windows7/64bit SP
  • VisualStudio2015 SP1
  • C++/MFC
  • C Make 3.13.2
  • OpenCV 3.4.1(VisualStudio2015で開発したMFCのx86アプリで動作するなら別のバージョンでも構いません)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

適切に32bitのlibをリンクできていないと推測します。

ライブラリのリンクの設定をどのように行ってますでしょうか。

投稿2018/12/27 06:47

kazto

総合スコア7196

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

notgoodpg

2018/12/27 07:20 編集

ありがとうございます。 リンクの設定は テストプロジェクトのプロパティ>リンカー>追加のライブラリディレクトリ に、 [OpenCV.slnのあるフォルダ]\install\x86\vc14\lib と設定してあります。 追加のインクルードも テストプロジェクトのプロパティ>C/C++>追加のインクルードディレクトリ に、 [OpenCV.slnのあるフォルダ]\install\include と設定してあります。 パスも [OpenCV.slnのあるフォルダ]\install\x86\vc14\bin で通してあります。 libファイルはOpenCV.slnを構成プロパティをプラットフォームをWin32に設定してDebug、Release両方でビルドして生成させてあります。 *[OpenCV.slnのあるフォルダ]は、OpenCV.slnがCMakeに生成されたフォルダのフルパスを表しています。
Bull

2018/12/27 11:19

ライブラリを指定していないのではないですか? プロジェクトのプロパティー > リンカー > 入力 > 追加の依存ファイルには何が記述されていますか?
dodox86

2018/12/27 11:54 編集

Bullさんのご指摘のとおりっぽいですね。ちなみに質問者さんと同じような開発環境だったのでopencv3.4.1 + MFCアプリで試してみたところ、cv::imshow()の呼び出しで、DEBUGビルドではlibファイルを厳密に区別しないとリンクエラーが出ました。名前マングリングの違いのせいでしょう。以下のように分けてOKでした。(もともとRelease用とDebug用で分けるべきでしょうけれど) #ifdef _DEBUG #pragma comment(lib, "opencv_highgui341d.lib") #else #pragma comment(lib, "opencv_highgui341.lib") #endif ご参考まで、です。
notgoodpg

2018/12/28 00:02

Bullさんのご指摘のとおりでした。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問