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

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

ただいまの
回答率

91.87%

  • C++

    1934questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Ubuntu

    598questions

    Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

  • OpenCV

    403questions

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

OpenCVのリンクエラー

解決済

回答 1

投稿 2017/01/17 20:35

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

chie_y

score 8

現在、Ubuntu上でOpenCVを使用したC++プログラムを作成しております。
しかし、下記のエラーが出てしまいます。

face_detection.cpp:(.text+0x50): `cv::CascadeClassifier::CascadeClassifier()' に対する定義されていない参照です
face_detection.cpp:(.text+0x7d): `cv::CascadeClassifier::load(cv::String const&)' に対する定義されていない参照です
face_detection.cpp:(.text+0xc2): `cv::VideoCapture::VideoCapture(int)' に対する定義されていない参照です
face_detection.cpp:(.text+0xd1): `cv::VideoCapture::isOpened() const' に対する定義されていない参照です
face_detection.cpp:(.text+0xe7): `cv::VideoCapture::operator>>(cv::Mat&)' に対する定義されていない参照です
face_detection.cpp:(.text+0x14c): `cv::cvtColor(cv::_InputArray const&, cv::_OutputArray const&, int, int)' に対する定義されていない参照です
face_detection.cpp:(.text+0x1ff): `cv::CascadeClassifier::detectMultiScale(cv::_InputArray const&, std::vector<cv::Rect_<int>, std::allocator<cv::Rect_<int> > >&, double, int, int, cv::Size_<int>, cv::Size_<int>)' に対する定義されていない参照です
face_detection.cpp:(.text+0x3a2): `cv::rectangle(cv::_InputOutputArray const&, cv::Point_<int>, cv::Point_<int>, cv::Scalar_<double> const&, int, int, int)' に対する定義されていない参照です
face_detection.cpp:(.text+0x40f): `cv::imshow(cv::String const&, cv::_InputArray const&)' に対する定義されていない参照です
face_detection.cpp:(.text+0x437): `cv::waitKey(int)' に対する定義されていない参照です
face_detection.cpp:(.text+0x458): `cv::VideoCapture::~VideoCapture()' に対する定義されていない参照です
face_detection.cpp:(.text+0x476): `cv::CascadeClassifier::~CascadeClassifier()' に対する定義されていない参照です
face_detection.cpp:(.text+0x553): `cv::VideoCapture::~VideoCapture()' に対する定義されていない参照です
face_detection.cpp:(.text+0x57b): `cv::CascadeClassifier::~CascadeClassifier()' に対する定義されていない参照です
face_detection.o: 関数 `__static_initialization_and_destruction_0(int, int)' 内:
face_detection.cpp:(.text+0x5e8): `std::ios_base::Init::Init()' に対する定義されていない参照です
face_detection.cpp:(.text+0x5f7): `std::ios_base::Init::~Init()' に対する定義されていない参照です
face_detection.o: 関数 `cv::String::String(char const*)' 内:
face_detection.cpp:(.text._ZN2cv6StringC2EPKc[_ZN2cv6StringC5EPKc]+0x4d): `cv::String::allocate(unsigned long)' に対する定義されていない参照です
face_detection.o: 関数 `cv::String::~String()' 内:
face_detection.cpp:(.text._ZN2cv6StringD2Ev[_ZN2cv6StringD5Ev]+0x14): `cv::String::deallocate()' に対する定義されていない参照です
face_detection.o: 関数 `cv::String::operator=(cv::String const&)' 内:
face_detection.cpp:(.text._ZN2cv6StringaSERKS0_[_ZN2cv6StringaSERKS0_]+0x28): `cv::String::deallocate()' に対する定義されていない参照です
face_detection.o: 関数 `cv::Mat::~Mat()' 内:
face_detection.cpp:(.text._ZN2cv3MatD2Ev[_ZN2cv3MatD5Ev]+0x39): `cv::fastFree(void*)' に対する定義されていない参照です
face_detection.o: 関数 `cv::Mat::release()' 内:
face_detection.cpp:(.text._ZN2cv3Mat7releaseEv[_ZN2cv3Mat7releaseEv]+0x4b): `cv::Mat::deallocate()' に対する定義されていない参照です
face_detection.o: 関数 `cvflann::anyimpl::operator<<(std::ostream&, cvflann::anyimpl::empty_any const&)' 内:
face_detection.cpp:(.text._ZN7cvflann7anyimpllsERSoRKNS0_9empty_anyE[_ZN7cvflann7anyimpllsERSoRKNS0_9empty_anyE]+0x1d): `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)' に対する定義されていない参照です
face_detection.o: 関数 `cvflann::anyimpl::base_any_policy::~base_any_policy()' 内:
face_detection.cpp:(.text._ZN7cvflann7anyimpl15base_any_policyD2Ev[_ZN7cvflann7anyimpl15base_any_policyD5Ev]+0x29): `operator delete(void*)' に対する定義されていない参照です
face_detection.o: 関数 `cvflann::anyimpl::base_any_policy::~base_any_policy()' 内:
face_detection.cpp:(.text._ZN7cvflann7anyimpl15base_any_policyD0Ev[_ZN7cvflann7anyimpl15base_any_policyD5Ev]+0x20): `operator delete(void*)' に対する定義されていない参照です
face_detection.o: 関数 `cvflann::anyimpl::big_any_policy<cvflann::flann_centers_init_t>::print(std::ostream&, void* const*)' 内:
face_detection.cpp:(.text._ZN7cvflann7anyimpl14big_any_policyINS_20flann_centers_init_tEE5printERSoPKPv[_ZN7cvflann7anyimpl14big_any_policyINS_20flann_centers_init_tEE5printERSoPKPv]+0x29): `std::ostream::operator<<(int)' に対する定義されていない参照です
face_detection.o: 関数 `cvflann::anyimpl::big_any_policy<cvflann::flann_algorithm_t>::print(std::ostream&, void* const*)' 内:
face_detection.cpp:(.text._ZN7cvflann7anyimpl14big_any_policyINS_17flann_algorithm_tEE5printERSoPKPv[_ZN7cvflann7anyimpl14big_any_policyINS_17flann_algorithm_tEE5printERSoPKPv]+0x29): `std::ostream::operator<<(int)' に対する定義されていない参照です
face_detection.o: 関数 `cvflann::anyimpl::big_any_policy<cv::String>::print(std::ostream&, void* const*)' 内:
face_detection.cpp:(.text._ZN7cvflann7anyimpl14big_any_policyIN2cv6StringEE5printERSoPKPv[_ZN7cvflann7anyimpl14big_any_policyIN2cv6StringEE5printERSoPKPv]+0x31): `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)' に対する定義されていない参照です
(以下、省略)

collect2: error: ld returned 1 exit status
Makefile:16: ターゲット 'face_detection' のレシピで失敗しました
make: *** [face_detection] エラー 1

リンクがうまくいってないようなのですが、Makefileでライブラリは指定しています。

# Makefile
# face_detection: face_detection.cpp
#     gcc -I /usr/local/include -o face_detection face_detection.cpp

CC            = gcc
CFLAGS        = -O4 -Wall -I/usr/local/include
DEST        = /usr/local/bin
LDFLAGS        = -L/usr/local/lib
LIBS        = -lhoge -lm
OBJS        = face_detection.o
PROGRAM        = face_detection

all:        $(PROGRAM)

$(PROGRAM):    $(OBJS)
            # $(CC) $(OBJS) $(LDFLAGS) $(LIBS) -o $(PROGRAM)
            $(CC) $(OBJS) $(LDFLAGS) -o $(PROGRAM)

clean:        rm -f *.o *~ $(PROGRAM)

install:    $(PROGRAM)
            install -s $(PROGRAM) $(DEST)
/usr/local/lib$ ls -al
合計 44880
drwxr-xr-x  5 root root      4096  113 14:49 .
drwxr-xr-x 10 root root      4096  426  2016 ..
lrwxrwxrwx  1 root root        22  113 13:05 libopencv_world.so -> libopencv_world.so.3.2
lrwxrwxrwx  1 root root        24  113 13:05 libopencv_world.so.3.2 -> libopencv_world.so.3.2.0
-rw-r--r--  1 root root  45935816  113 13:21 libopencv_world.so.3.2.0
drwxr-xr-x  2 root root      4096  113 13:09 pkgconfig
drwxrwsr-x  4 root staff     4096  112 23:18 python2.7
drwxrwsr-x  3 root staff     4096  426  2016 python3.5


ソースコードは以下のとおりです。

using namespace std;

#include "opencv2/opencv.hpp"
#include <vector>
#include <stdio.h>

using namespace cv;

int main(int argc, char *argv[])
{
    Mat im, gray;                    // 変数宣言
    // カスケード分類器の取得
    CascadeClassifier cascade;        
    if (!cascade.load("haarcascade_frontalface_alt.xml")) return -1;
    vector<Rect> faces;
    VideoCapture cap(0);            // カメラのキャプチャ
    if (!cap.isOpened()) return -1;    // キャプチャのエラー処理

    while (1) {
        cap >> im;                            // カメラ映像の取得
        cvtColor(im, gray, CV_RGB2GRAY);    // グレースケール変換
        // カスケード分類器で顔の探索
        cascade.detectMultiScale(gray, faces, 1.2, 2, CV_HAAR_SCALE_IMAGE, Size(50, 50));
        // 顔領域を矩形で囲む
        vector<Rect>::const_iterator r = faces.begin();
        for (; r != faces.end(); ++r) {
            rectangle(im, Point(r->x, r->y), 
                Point(r->x + r->width, r->y + r->height), Scalar(20, 20, 200), 3, CV_AA);
        }
        imshow("Camera", im);                // 映像の表示
        if (waitKey(30) >= 0) break;        // キー入力があれば終了
    }
    return 0;
}

何か根本的に設定がおかしいのでしょうか?
基本的なことで恐縮ですが、教えていただけると幸いです。・。

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

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

    クリップした質問はマイページの「クリップ」タブからいつでも見ることができます。

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • osamuya

    2017/01/17 20:55

    外から見ているとなかなか難しいところなので、インストールの方法とどの時点でエラーが出るようになったのか書いていただけると、少しわかるかもです。

    キャンセル

  • chie_y

    2017/01/17 21:14

    ご回答、ありがとうございます。インストールは、http://umejan.hatenablog.com/entry/2016/04/20/233642 を参考におこないました(ただ、バージョンは3.2.0です)エラーが出たのははじめからです。ちなみに、Pythonでは普通にOpenCVは使えています。

    キャンセル

回答 1

checkベストアンサー

0

Makefile を以下のように書き換えてください。

# Makefile
# face_detection: face_detection.cpp
#     gcc -I /usr/local/include -o face_detection face_detection.cpp

CC            = gcc
CFLAGS        = -O4 -Wall -I/usr/local/include
DEST        = /usr/local/bin
LDFLAGS        = -L/usr/local/lib
LIBS        = -lhoge -lm `pkg-config --libs opencv`
OBJS        = face_detection.o
PROGRAM        = face_detection

all:        $(PROGRAM)

$(PROGRAM):    $(OBJS)
            $(CC) $(OBJS) $(LDFLAGS) $(LIBS) -o $(PROGRAM)

clean:        rm -f *.o *~ $(PROGRAM)

install:    $(PROGRAM)
            install -s $(PROGRAM) $(DEST)

P.S.
しかし、このMakefileは微妙ですね。

投稿 2017/01/17 21:23

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

    以下のような回答は評価を下げられます

    • 間違っている回答
    • 質問の回答になっていない投稿
    • 不快な投稿

    評価を下げる際はその理由をコメントに書き込んでください。

  • 2017/01/17 21:31

    ご回答、ありがとうございます。

    Makefileを書き換えて実行したところ、以下のエラーが出るようになってしまいました。

    gcc face_detection.o -L/usr/local/lib -lm `pkg-config --libs opencv` -o face_detection
    /usr/bin/ld: face_detection.o: シンボル '_ZTVN10__cxxabiv117__class_type_infoE@@CXXABI_1.3' への未定義参照です
    //usr/lib/x86_64-linux-gnu/libstdc++.so.6: error adding symbols: DSO missing from command line
    collect2: error: ld returned 1 exit status
    Makefile:12: ターゲット 'face_detection' のレシピで失敗しました
    make: *** [face_detection] エラー 1

    なにか設定でおかしいところがあるのでしょうか?
    引き続きよろしくお願いいたします。

    キャンセル

  • 2017/01/17 21:33

    CC = gcc

    CC = g++
    としてください

    キャンセル

  • 2017/01/17 23:22

    無事、コンパイルして実行ファイルができました。
    ありがとうございました。

    キャンセル

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

ただいまの回答率

91.87%

関連した質問

同じタグがついた質問を見る

  • C++

    1934questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Ubuntu

    598questions

    Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

  • OpenCV

    403questions

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

閲覧数の多いC++の質問