none
LINK 2019 エラー OpenCV2.1 VisualStudio2008 C++ RRS feed

  • 質問

  • VisualStudio2008 でテレスカウターSDKを用いて開発を行おうとしています。

    OpenCV2.1を導入しようと考えているのですが、ビルドして実行しようとすると

    error LNK2019: 未解決の外部シンボル cvCreateCameraCapture が関数 WinMain で参照されました。

    fatal error LNK1120: 外部参照 1 が未解決です。 (加筆)

    というようなエラーが出ます。(OpenCVの関数部分でLINK2019エラーが発生する)

    ツール→オプション→プロジェクトおよびソリューション→VC++ディレクトリ  にて

    インクルードディレクトリに C:\OpenCV2.1\include\opencv

    ライブラリディレクトリに C:\OpenCV2.1\lib

    を追加しています。

    また、プロジェクトのプロパティ→リンカ→入力→追加の依存ファイルに

    cv210.lib cvaux210.lib cxcore210.lib highgui210.lib 

    を追加しています。

    ソースコード先頭に

    #include "cv.h"
    #include "highgui.h"

    を追加しています。

    (加筆)

    また、プリプロセッサに

    WIN64

    を追加しています。

    開発初心者でしてこれ以上どこをいじればいいのか分からず困っています…。

    お分かりになる方がいらっしゃいましたら、ご教示くださいますよう、お願い申し上げます。



    • 編集済み orange96 2014年9月10日 5:25
    2014年9月9日 6:41

回答

  • また、プリプロセッサに WIN64 を追加しています。

    そうではなくて64bitアプリケーションを作成しようとしているのでしょうか? であれば配布されているOpenCVは32bitライブラリとしてビルドされているため、64bitアプリケーションを作成することはできません。
    32bitアプリケーションとするか、ご自身でOpenCVをビルドし直す必要があります。

    質問とは別に指摘です。

    インクルードディレクトリを「C:\OpenCV2.1\include」としたうえで、

    #include <opencv/cv.h> 
    #include <opencv/highgui.h>

    と記述すべきです。cv.hでは他のライブラリとファイル名が競合し兼ねないですし、外部ヘッダーファイルを参照する際は "" ではなく <> を使います。(#include <stdio.h>と書きますよね?)

    • 回答としてマーク orange96 2014年9月11日 6:33
    2014年9月10日 7:09

すべての返信

  • OpenCVは素人同然ですが、
    まず、cvCreateCameraCapture()関数はOpenCV 1.0の関数ですよね。
    OpenCV2.0以降の場合、cvCaptureFromCAM() 関数を使うという情報が
    多数検索できるのですが、いかがでしょう。

    (加筆)
    コンパイルエラーが出なかったとなると、インクルードファイルの
    参照先がOpenCV1.0になってるか、OpenVC1.0のヘッダーが
    生き残っているかもしれませんので、注意しましょう。
    2014年9月9日 8:18
  • さっそくのご返信ありがとうございます。

    highgui.h内で

    #define cvCaptureFromCAM cvCreateCameraCapture

    が定義されているようで cvCaptureFromCAM() を用いた場合でも

    error LNK2019: 未解決の外部シンボル cvCreateCameraCapture が関数 WinMain で参照されました。

    のエラーが出ます。(highgui.h 自体はインクルードできているようです)

    また、質問時に省略してしまっていたのですが、

    fatal error LNK1120: 外部参照 1 が未解決です。

    のエラーも出ています。(これがコンパイルエラーでしょうか)

    2014年9月10日 5:23
  • その他のLibをリンクしてみてはどうでしょう。現在リンクされているライブラリの他、
    以下のものがありませんか。
      cxts210.lib
      ml210.lib
      opencv_ffmpeg210.lib
    およびこれらのデバッグ版のライブラリ(ファイル名の末尾にdのついたもの)が
    あるのではないでしょうか。
    もちろん、デバックビルド時にはデバッグ版のライブラリをリンクし、
    リリースビルドの場合にはリリース版のライブラリをリンクします。

    2014年9月10日 6:33
  • #ifdef _DEBUG
        //Debugモードの場合
        #pragma comment(lib,"C:\\OpenCV2.1\\lib\\cv210d.lib")
        #pragma comment(lib,"C:\\OpenCV2.1\\lib\\cxcore210d.lib")
        #pragma comment(lib,"C:\\OpenCV2.1\\lib\\cvaux210d.lib")
        #pragma comment(lib,"C:\\OpenCV2.1\\lib\\highgui210d.lib")
        #pragma comment(lib,"C:\\OpenCV2.1\\lib\\ml210d.lib")
        #pragma comment(lib,"C:\\OpenCV2.1\\lib\\opencv_ffmpeg210d.lib")
    #else
        //Releaseモードの場合
        #pragma comment(lib,"C:\\OpenCV2.1\\lib\\cv210.lib")
        #pragma comment(lib,"C:\\OpenCV2.1\\lib\\cxcore210.lib")
        #pragma comment(lib,"C:\\OpenCV2.1\\lib\\cvaux210.lib")
        #pragma comment(lib,"C:\\OpenCV2.1\\lib\\highgui210.lib")
        #pragma comment(lib,"C:\\OpenCV2.1\\lib\\cxts210.lib")
        #pragma comment(lib,"C:\\OpenCV2.1\\lib\\ml210.lib")
        #pragma comment(lib,"C:\\OpenCV2.1\\lib\\opencv_ffmpeg210.lib")
    #endif

    を追記して試して見ましたがやはり

    error LNK2019: 未解決の外部シンボル cvCreateCameraCapture が関数 WinMain で参照されました。

    のエラーが出力されます。

    プラットフォームがTele Scouter SDK なのが問題なのでしょうか…

    2014年9月10日 7:09
  • また、プリプロセッサに WIN64 を追加しています。

    そうではなくて64bitアプリケーションを作成しようとしているのでしょうか? であれば配布されているOpenCVは32bitライブラリとしてビルドされているため、64bitアプリケーションを作成することはできません。
    32bitアプリケーションとするか、ご自身でOpenCVをビルドし直す必要があります。

    質問とは別に指摘です。

    インクルードディレクトリを「C:\OpenCV2.1\include」としたうえで、

    #include <opencv/cv.h> 
    #include <opencv/highgui.h>

    と記述すべきです。cv.hでは他のライブラリとファイル名が競合し兼ねないですし、外部ヘッダーファイルを参照する際は "" ではなく <> を使います。(#include <stdio.h>と書きますよね?)

    • 回答としてマーク orange96 2014年9月11日 6:33
    2014年9月10日 7:09
  • ご指摘ありがとうございます。

    参考にしてヘッダー参照の部分を書き換えさせていただきました。

    実はこのエラーが発生する前に

    error C4235: 非標準の拡張機能が使用されています : '__asm' キーワードはこのアーキテクチャではサポートされていません

    というエラーが出たのでプリプロセッサにWIN64を追加したところエラーが無くなったので放置していました。

    プロジェクトファイル自体が自作したものではなく譲り受けたものなので確かではないのですが、おそらく64bitアプリケーションなのだと思います。

    32bitアプリケーションに変更することは可能なのでしょうか?

    2014年9月10日 8:15
  • [ビルド]-[構成マネージャー]から「アクティブソリューションプラットフォーム」がx64やARMでなくWin32となっていることを確認してください。より正確にはその下の表で「プラットフォーム」のカラムがWin32となることです。

    独自のWIN64プリプロセッサ定義はトラブルの元ですので削除してください。 __asm の問題は解決しなければならない問題でしょうが、本件とは別件となると思います。

    # ちなみに、手元のVS2013環境で試したところ、Win32プラットフォームで WIN64 を定義しただけではエラーになりませんでした。プラットフォームとしてWIN64が選択されている場合に質問のエラーが発生しました。

    2014年9月10日 8:28
  • 現在プラットフォームが Tele Scouter SDK (ARMV4I) なのですが、

    新規作成で設定のコピー元を Tele Scouter SDK (ARMV4I) にしてWin32を新規作成しました。

    fatal error C1083: include ファイルを開けません。'ceconfig.h': No such file or directory

    というエラーが発生したのですが、ひとまずLINK2019のエラーは解決したということでしょうか。

    2014年9月10日 8:57
  • そもそも、アプリケーションを作成できたとして、どこで実行することを考えているのでしょうか?

    回答の如何にかかわらず、既に説明した通り、OpenCVはWin32ライブラリとしてしか配布されていないので、それ以外のプラットフォームで実行したい場合はご自身でビルドする必要があります。

    2014年9月10日 9:06
  • TeleScouter(ARMV4I)で使用する場合はOpenCVを(ARMV4I)で使えるようビルドするということでしょうか。

    2014年9月10日 9:11
  • 実行環境が32bitでないのでOpenCVをそのままで使えないことが理解出来ました。

    調べたところ自身でビルドすることは現在の知識・技術では難しくOpenCVの導入を断念し、別の方法をとることにいたしました。

    エラーについて丁寧に回答してくださいました仲澤様、佐祐理様ありがとうございました。

    2014年9月11日 6:32