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

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

ただいまの
回答率

90.03%

画像を表示するためのプログラムをコンパイルしたいのですが、関数に関するエラーが出てきます。

解決済

回答 2

投稿

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

carnage0216

score 131

<環境>

  • Windows10 64bit
  • コマンドプロンプト
  • MinGW
  • GCC

プログラムはc++です。

#include <opencv2/opencv.hpp>
//#include <opencv2/opencv_lib.hpp>//

#if _DEBUG
#pragma comment(lib, "opencv_calib3d2411d.lib")
#pragma comment(lib, "opencv_contrib2411d.lib")
#pragma comment(lib, "opencv_core2411d.lib")
#pragma comment(lib, "opencv_features2d2411d.lib")
#pragma comment(lib, "opencv_flann2411d.lib")
#pragma comment(lib, "opencv_gpu2411d.lib")
#pragma comment(lib, "opencv_highgui2411d.lib")
#pragma comment(lib, "opencv_imgproc2411d.lib")
#pragma comment(lib, "opencv_legacy2411d.lib")
#pragma comment(lib, "opencv_ml2411d.lib")
#pragma comment(lib, "opencv_nonfree2411d.lib")
#pragma comment(lib, "opencv_objdetect2411d.lib")
#pragma comment(lib, "opencv_ocl2411d.lib")
#pragma comment(lib, "opencv_photo2411d.lib")
#pragma comment(lib, "opencv_stitching2411d.lib")
#pragma comment(lib, "opencv_superres2411d.lib")
#pragma comment(lib, "opencv_ts2411d.lib")
#pragma comment(lib, "opencv_video2411d.lib")
#pragma comment(lib, "opencv_videostab2411d.lib")
#else
#pragma comment(lib, "opencv_calib3d2411.lib")
#pragma comment(lib, "opencv_contrib2411.lib")
#pragma comment(lib, "opencv_core2411.lib")
#pragma comment(lib, "opencv_features2d2411.lib")
#pragma comment(lib, "opencv_flann2411.lib")
#pragma comment(lib, "opencv_gpu2411.lib")
#pragma comment(lib, "opencv_highgui2411.lib")
#pragma comment(lib, "opencv_imgproc2411.lib")
#pragma comment(lib, "opencv_legacy2411.lib")
#pragma comment(lib, "opencv_ml2411.lib")
#pragma comment(lib, "opencv_nonfree2411.lib")
#pragma comment(lib, "opencv_objdetect2411.lib")
#pragma comment(lib, "opencv_ocl2411.lib")
#pragma comment(lib, "opencv_photo2411.lib")
#pragma comment(lib, "opencv_stitching2411.lib")
#pragma comment(lib, "opencv_superres2411.lib")
#pragma comment(lib, "opencv_ts2411.lib")
#pragma comment(lib, "opencv_video2411.lib")
#pragma comment(lib, "opencv_videostab2411.lib")
#endif
#include <opencv2/highgui/highgui.hpp>

int main(void)
{
  cv::Mat src_img;
  src_img = cv::imread("C:\\Users\\Daito\\Desktop\\DTWW6svVQAEvgvk.jpg", 1);
  // 画像が読み込まれなかったらプログラム終了
  if(src_img.empty()) return -1;

  // 結果画像表示
  cv::namedWindow("Image", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
  cv::imshow("Image", src_img);
  cv::waitKey(0);
}


プログラム内の

#if _DEBUG
#pragma comment(lib, "opencv_calib3d2411d.lib")
#pragma comment(lib, "opencv_contrib2411d.lib")
#pragma comment(lib, "opencv_core2411d.lib")
#pragma comment(lib, "opencv_features2d2411d.lib")
#pragma comment(lib, "opencv_flann2411d.lib")
#pragma comment(lib, "opencv_gpu2411d.lib")
#pragma comment(lib, "opencv_highgui2411d.lib")
#pragma comment(lib, "opencv_imgproc2411d.lib")
#pragma comment(lib, "opencv_legacy2411d.lib")
#pragma comment(lib, "opencv_ml2411d.lib")
#pragma comment(lib, "opencv_nonfree2411d.lib")
#pragma comment(lib, "opencv_objdetect2411d.lib")
#pragma comment(lib, "opencv_ocl2411d.lib")
#pragma comment(lib, "opencv_photo2411d.lib")
#pragma comment(lib, "opencv_stitching2411d.lib")
#pragma comment(lib, "opencv_superres2411d.lib")
#pragma comment(lib, "opencv_ts2411d.lib")
#pragma comment(lib, "opencv_video2411d.lib")
#pragma comment(lib, "opencv_videostab2411d.lib")
#else
#pragma comment(lib, "opencv_calib3d2411.lib")
#pragma comment(lib, "opencv_contrib2411.lib")
#pragma comment(lib, "opencv_core2411.lib")
#pragma comment(lib, "opencv_features2d2411.lib")
#pragma comment(lib, "opencv_flann2411.lib")
#pragma comment(lib, "opencv_gpu2411.lib")
#pragma comment(lib, "opencv_highgui2411.lib")
#pragma comment(lib, "opencv_imgproc2411.lib")
#pragma comment(lib, "opencv_legacy2411.lib")
#pragma comment(lib, "opencv_ml2411.lib")
#pragma comment(lib, "opencv_nonfree2411.lib")
#pragma comment(lib, "opencv_objdetect2411.lib")
#pragma comment(lib, "opencv_ocl2411.lib")
#pragma comment(lib, "opencv_photo2411.lib")
#pragma comment(lib, "opencv_stitching2411.lib")
#pragma comment(lib, "opencv_superres2411.lib")
#pragma comment(lib, "opencv_ts2411.lib")
#pragma comment(lib, "opencv_video2411.lib")
#pragma comment(lib, "opencv_videostab2411.lib")
#endif

``` は#include <opencv2/opencv_lib.hpp>の中身です。分け合って直接書いています。

こちらがエラーです。

C:\Users\Daito\AppData\Local\Temp\ccNNjKfm.o:ヲvO€.cpp:(.text+0x52): undefined reference to `cv::imread(cv::String const&, int)'
C:\Users\Daito\AppData\Local\Temp\ccNNjKfm.o:ヲvO€.cpp:(.text+0xc3): undefined reference to `cv::namedWindow(cv::String const&, int)'
C:\Users\Daito\AppData\Local\Temp\ccNNjKfm.o:ヲvO€.cpp:(.text+0x109): undefined reference to `cv::imshow(cv::String const&, cv::_InputArray const&)'
C:\Users\Daito\AppData\Local\Temp\ccNNjKfm.o:ヲvO€.cpp:(.text+0x129): undefined reference to `cv::waitKey(int)'
C:\Users\Daito\AppData\Local\Temp\ccNNjKfm.o:ヲvO€.cpp:(.text$_ZN2cv6StringC1EPKc[__ZN2cv6StringC1EPKc]+0x3c): undefined reference to `cv::String::allocate(unsigned int)'
C:\Users\Daito\AppData\Local\Temp\ccNNjKfm.o:ヲvO€.cpp:(.text$_ZN2cv6StringD1Ev[__ZN2cv6StringD1Ev]+0xf): undefined reference to `cv::String::deallocate()'
C:\Users\Daito\AppData\Local\Temp\ccNNjKfm.o:ヲvO€.cpp:(.text$_ZN2cv3MatD1Ev[__ZN2cv3MatD1Ev]+0x2d): undefined reference to `cv::fastFree(void*)'
C:\Users\Daito\AppData\Local\Temp\ccNNjKfm.o:ヲvO€.cpp:(.text$_ZN2cv3Mat7releaseEv[__ZN2cv3Mat7releaseEv]+0x40): undefined reference to `cv::Mat::deallocate()'
C:\Users\Daito\AppData\Local\Temp\ccNNjKfm.o:ヲvO€.cpp:(.text$_ZN2cv3MataSEOS0_[__ZN2cv3MataSEOS0_]+0xa4): undefined reference to `cv::fastFree(void*)'
collect2.exe: error: ld returned 1 exit status

エラーを見る限り関数によってエラーが出ているように見えるのですが、ヘッダファイルはちゃんと読み込めているので関数でのエラーがなぜ起きているのかヒントを頂けないでしょうか?
OPENCVに関するライブラリとコンパイラしたいソースコードはcdで移動したディレクトリの「画像表示」という場所にすべて入っています。表示する画像の情報はC:\\Users\\Daito\\Desktop\\DTWW6svVQAEvgvk.jpgと書きました。デスクトップに置いてあります。
どうかよろしくお願いいたします。

補足のようで申し訳ないのですが、

  • コマンドプロンプトのエラーの方では必要なライブラリなどは教えてくれるのでしょうか?
    また、
  • 必要なライブラリは移動したディレクトリに入れておけば良いのでしょうか?
  • asmさんはどうやって、コマンドプロンプトでエラーを解決しているのでしょうか?
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+2

gccは自動リンクに対応していませんので
#pragma comment(lib, "opencv_calib3d2411d.lib")は無意味です。
対応するライブラリファイルを手動でリンクする必要があります。

以前も指摘されたと思いますが、MSVCでコンパイルしたライブラリファイルをgccでリンクする事は現状私の知りうる限り不可能です。
gccでコンパイルしなおす必要があります。

コマンドプロンプトのエラーの方では必要なライブラリなどは教えてくれるのでしょうか?

教えてくれません。ライブラリのマニュアルなどにリンクする必要のあるライブラリが書いてあるはずです。

必要なライブラリは移動したディレクトリに入れておけば良いのでしょうか?

前述した通り、gccにおいては自動リンクはできないのでコマンドラインオプションでリンカに渡してやる必要があります。
規模によっては面倒だからMakefileなどを使います。

asmさんはどうやって、コマンドプロンプトでエラーを解決しているのでしょうか?

なんの話でしょうか・・・?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/07 22:41

    > 信用していただけないかもしれませんが、これでも基礎勉強をしている最中です。こちらのサイトを利用してCを勉強しています。https://paiza.jp/works
    ここのサイトを見ると
    > 実行環境構築いらずでブラウザ上でプログラミング言語を実行できるので、誰でもすぐに学習を始められます。
    とあります。
    見た感じだとオンラインで学習できるようですが、これでは実際の環境では役に立たないですよね?
    何らかの書籍などpaiza以外でも勉強することをお勧めします。
    あと、paizaにはC++はないようです。C++を使いたいのであればそちらも学習してください。

    キャンセル

  • 2018/04/07 22:46

    勉強環境をつくるのも難しいです。
    はい、わかりました。

    キャンセル

  • 2018/04/07 22:46

    どうもありがとうございます。

    キャンセル

0

[ご参考] Visual C++ 2015 + OpenCV 3.4 でイッパツOK

#include <opencv2/opencv.hpp>

int main() {
  cv::Mat src_img;
  src_img = cv::imread("img1.jpg", 1);
  // 画像が読み込まれなかったらプログラム終了
  if(src_img.empty()) return -1;

  // 結果画像表示
  cv::namedWindow("Image", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
  cv::imshow("Image", src_img);
  cv::waitKey(0);
}

イメージ説明

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/07 23:35

    えーと。以下のプログラムはビルドなされたのでしょうか?
    #include <opencv2/opencv.hpp>
    //#include <opencv2/opencv_lib.hpp>//

    #if _DEBUG
    #pragma comment(lib, "opencv_calib3d2411d.lib")
    #pragma comment(lib, "opencv_contrib2411d.lib")
    #pragma comment(lib, "opencv_core2411d.lib")
    #pragma comment(lib, "opencv_features2d2411d.lib")
    #pragma comment(lib, "opencv_flann2411d.lib")
    #pragma comment(lib, "opencv_gpu2411d.lib")
    #pragma comment(lib, "opencv_highgui2411d.lib")
    #pragma comment(lib, "opencv_imgproc2411d.lib")
    #pragma comment(lib, "opencv_legacy2411d.lib")
    #pragma comment(lib, "opencv_ml2411d.lib")
    #pragma comment(lib, "opencv_nonfree2411d.lib")
    #pragma comment(lib, "opencv_objdetect2411d.lib")
    #pragma comment(lib, "opencv_ocl2411d.lib")
    #pragma comment(lib, "opencv_photo2411d.lib")
    #pragma comment(lib, "opencv_stitching2411d.lib")
    #pragma comment(lib, "opencv_superres2411d.lib")
    #pragma comment(lib, "opencv_ts2411d.lib")
    #pragma comment(lib, "opencv_video2411d.lib")
    #pragma comment(lib, "opencv_videostab2411d.lib")
    #else
    #pragma comment(lib, "opencv_calib3d2411.lib")
    #pragma comment(lib, "opencv_contrib2411.lib")
    #pragma comment(lib, "opencv_core2411.lib")
    #pragma comment(lib, "opencv_features2d2411.lib")
    #pragma comment(lib, "opencv_flann2411.lib")
    #pragma comment(lib, "opencv_gpu2411.lib")
    #pragma comment(lib, "opencv_highgui2411.lib")
    #pragma comment(lib, "opencv_imgproc2411.lib")
    #pragma comment(lib, "opencv_legacy2411.lib")
    #pragma comment(lib, "opencv_ml2411.lib")
    #pragma comment(lib, "opencv_nonfree2411.lib")
    #pragma comment(lib, "opencv_objdetect2411.lib")
    #pragma comment(lib, "opencv_ocl2411.lib")
    #pragma comment(lib, "opencv_photo2411.lib")
    #pragma comment(lib, "opencv_stitching2411.lib")
    #pragma comment(lib, "opencv_superres2411.lib")
    #pragma comment(lib, "opencv_ts2411.lib")
    #pragma comment(lib, "opencv_video2411.lib")
    #pragma comment(lib, "opencv_videostab2411.lib")
    #endif
    #include <opencv2/highgui/highgui.hpp>

    int main(void)
    {
    cv::Mat src_img;
    src_img = cv::imread("C:\\Users\\Daito\\Desktop\\DTWW6svVQAEvgvk.jpg", 1);
    // 画像が読み込まれなかったらプログラム終了
    if(src_img.empty()) return -1;

    // 結果画像表示
    cv::namedWindow("Image", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
    cv::imshow("Image", src_img);
    cv::waitKey(0);
    }

    キャンセル

  • 2018/04/07 23:38

    そいつはやってない。#include をばっさり削り、食わせる画像ファイル名を変えただけの修正をかけた。

    キャンセル

  • 2018/04/08 00:36

    そうだったのですか。どうもありがとうございます。

    キャンセル

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

  • ただいまの回答率 90.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる
  • トップ
  • C++に関する質問
  • 画像を表示するためのプログラムをコンパイルしたいのですが、関数に関するエラーが出てきます。