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

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

ただいまの
回答率

89.52%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,386

notgoodpg

score 35

前提・実現したいこと

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のバージョンが知りたいです。
または、利用可能だが設定すべき項目があるならばご指摘いただけたら幸いです。
よろしくお願いいたします。

該当のソースコード

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

    //CDialogEx::OnOK();
}

問題を解決するコード

#ifdef DEBUG
#pragma comment(lib,"opencv2\opencv_imgcodecs341d.dll")
#else
#pragma comment(lib,"opencv2\opencv_imgcodecs341.dll")
#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アプリで動作するなら別のバージョンでも構いません)
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/27 16:03 編集

    ありがとうございます。
    リンクの設定は
    テストプロジェクトのプロパティ>リンカー>追加のライブラリディレクトリ
    に、
    [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に生成されたフォルダのフルパスを表しています。

    キャンセル

  • 2018/12/27 20:19

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

    キャンセル

  • 2018/12/27 20:53 編集

    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

    ご参考まで、です。

    キャンセル

  • 2018/12/28 09:02

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

    キャンセル

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

  • ただいまの回答率 89.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる