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

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

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

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

C++

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

VSCodeDevContainer

VSCode Dev Containerは、VSCodeの拡張機能の一つ。Dockerコンテナ上でVSCodeの機能が使える開発環境を構築できます。開発環境の可搬性や再現性が高く、ローカル環境への影響が低い点などが特徴です。

Q&A

1回答

221閲覧

(VSCode,Opencv)インテリセンスでは問題ないが、コンパイル時にundefineが出る。

kitunekkodaisuk

総合スコア0

OpenCV

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

C++

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

VSCodeDevContainer

VSCode Dev Containerは、VSCodeの拡張機能の一つ。Dockerコンテナ上でVSCodeの機能が使える開発環境を構築できます。開発環境の可搬性や再現性が高く、ローカル環境への影響が低い点などが特徴です。

0グッド

0クリップ

投稿2024/12/05 07:41

実現したいこと

Opencvの関数を使えるようにする。
Windows11,VSCode,Opencv4.10

発生している問題・分からないこと

インテリセンスではOKなのに、Opencvのコンパイルが通らない。
「ワークスペースで問題は検出されていません。」とは出ているが、コンパイルが通らない。

エラーメッセージ

error

1PS C:\Users\ユーザー\Desktop\vscode\main\Code> cd "c:\Users\ユーザー\Desktop\vscode\main\Code\" ; if ($?) { g++ main.cpp -o main } ; if ($?) { .\main } 2C:/Program Files (x86)/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\ユーザー\AppData\Local\Temp\cc7gCc3n.o:main.cpp:(.text+0x99): undefined reference to `cv::Mat::Mat()' 3C:/Program Files (x86)/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\ユーザー\AppData\Local\Temp\cc7gCc3n.o:main.cpp:(.text+0xa5): undefined reference to `cv::Mat::~Mat()' 4collect2.exe: error: ld returned 1 exit status

該当のソースコード

cpp

1//以下main.cpp 2#include <opencv2/opencv.hpp> 3#include "otherlib/sum.h" 4 5//using namespace cv; 6 7int main(int argc, char **argv) 8{ 9 int value; 10 value = sum(50,100); 11 printf("%d\n",value); 12 13 cv::Mat image; 14 //Mat image = Mat::zeros(100, 100, CV_8UC3); 15 //imshow("", image); 16 //waitKey(0); 17 //return 0; 18} 19 20 21int sum(int min,int max){ 22 int num; 23 num = (min + max) * (max - min+1) / 2; 24 return num; 25} 26 27

cpp

1//以下sum.h 2int sum(int min,int max);

json

1//以下c_cpp_properties.json 2{ 3 "configurations": [ 4 { 5 "name": "Win32", 6 "includePath": [ 7 "${workspaceFolder}", 8 "C:\\Program Files (x86)\\mingw64\\include", 9 //ここにインクルードしたいパスを入力する 10 "C:\\Users\\ユーザー\\Desktop\\vscode\\main\\Code" 11 //"C:\\Users\\ユーザー\\Desktop\\vscode\\main\\Code\\opencv2" 12 ], 13 "defines": [ 14 "_DEBUG", 15 "UNICODE", 16 "_UNICODE" 17 ], 18 "windowsSdkVersion": "8.1", 19 "compilerPath": "C:\\Program Files (x86)\\mingw64\\bin\\g++.exe", 20 "cStandard": "c11", 21 "cppStandard": "c++17", 22 "intelliSenseMode": "clang-x64" 23 } 24 ], 25 "version": 4 26} 27 28 29

json

1//以下tasks.json 2{ 3 "tasks": [ 4 { 5 "type": "cppbuild", 6 "label": "C/C++: g++.exe アクティブなファイルのビルド", 7 "command": "C:\\Program Files (x86)\\mingw64\\bin\\g++.exe", 8 "args": [ 9 "-fdiagnostics-color=always", 10 "-g", 11 "${file}", 12 "-o", 13 "${fileDirname}\\${fileBasenameNoExtension}.exe", 14 "opencv" 15 //デバッグ用の情報の生成(-g) 16 //コンパイル対象となる.cppファイルの指定(-c + .cppファイル名) 17 //必要なヘッダファイルの存在するパスの指定(-I + パス名) 18 ], 19 "options": { 20 "cwd": "${fileDirname}" 21 }, 22 "problemMatcher": [ 23 "$gcc" 24 ], 25 "group": { 26 "kind": "build", 27 "isDefault": true 28 }, 29 "detail": "デバッガーによって生成されたタスク。" 30 } 31 ], 32 "version": "2.0.0" 33}

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

main.cpp以外の別のヘッダファイルを読み込むこんでビルドしてプログラムを再生するのには成功した。(読み込まなくてもopencvのライブラリを使わなければビルド可能)
opencv.hppの中身の、リンク先を変えたりすると、インテリセンスでエラーがでます。
なので、インテリセンスは正しく動いているものと思われます。
Opencvはwindows用をインストールしました。
環境設定でopencvのbinとlibとincludeまでのパスの3つを追加しました。

個人的にはtasks.jsonのargsが怪しいとは思っていますが、知識が足りなくてこれ以上何をしたらいいか分かりません。

補足

VScodeは日本語化しています。

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

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

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

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

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

yaito3014

2024/12/05 08:27

コンパイルというよりリンク時にエラーが出ているようです。 tasks.json の args に "opencv" とありますが、 "-lopencv_core" などとするのではないでしょうか?
guest

回答1

0

OpenCVは大量のライブラリを利用している巨大なライブラリなので、手動でリンクしようとすると一筋縄ではいかない場合が多いです。
OpenCVを動的ライブラリ・静的ライブラリのどちらで利用しているかによっても少し異なりますが、OpenCVの様々な機能を利用するためには色々なライブラリのリンクが必要になります。

提示されているコードを少し変更した以下をリンクさせることを考えてみますね。

cpp

1#include <opencv2/opencv.hpp> 2 3int main(int argc, char **argv) { 4 cv::Mat image = cv::Mat::zeros(100, 100, CV_8UC3); 5 6 cv::imshow("", image); 7 cv::waitKey(0); 8 9 return 0; 10}

これをリンクするには以下のオプションを追加する必要があります。

  • -lopencv_highgui
  • -lopencv_imgproc
  • -lopencv_core

困ったことにオプションの順番にも意味が出てきてしまうので気をつけてください。
また、おそらくこれらのライブラリが内部で利用している他のライブラリのリンクも必要になってくるはずです。zlibとか。

ここらへんを想定すると、手動でのビルド→リンクは現実的ではなくなってしまうため、CMakeを利用することをおすすめします。
CMakeは嫌われがちな癖のあるツールですが、OpenCVが提供してくれているサンプルを利用するだけであれば、CMakeが提供してくれるおいしい所だけを利用できるはずです。

以下を参考にしてみてください。
https://github.com/opencv/opencv/tree/4.x/samples/cpp/example_cmake

投稿2024/12/05 10:14

toge_

総合スコア280

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

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

kitunekkodaisuk

2024/12/06 07:14

回答ありがとうございます。試してみましたが解決できませんでした。 vscodeを触り始めて数日の人でもわかりやすいサイトはありませんでしょうか? https://zenn.dev/nadegata_memo/articles/8143303ae19968 上のサイトは「set(OpenCV_DIR path/to/opencv/build)」をうまく追加できませんでした。 追加したり変更したり色々してもエラーが変わらず、opencvのライブラリが読み込めず、詰みました。
kitunekkodaisuk

2024/12/06 07:16

vscode opencv windowsで検索して出てくる日本語のサイトはほぼ全て試しましたが全てopencvのリンク関係で詰みます。
toge_

2024/12/06 08:46

MinGW64で外部ライブラリを使った開発は、ある程度コンパイラの内情に詳しくないとハマる要素が多すぎるので、「これだけやればあっさり解決」とはいかないのが辛いですね。 - CMakeはしんどい - OpenCVのパスの指定などもろもろが難しい - でもWSLでのLinuxやVisual Studioでの開発をしたくない という前提だとMinGW上でパッケージを提供しているMSYS2を使うという手があるにはあります。 MSYS2はOpenCV4.10のパッケージを提供していて、OpenCVが依存する色々なライブラリのリンクをしなくてよい方法でビルドされているので手動でやっても比較的簡単です。 ちょっと古い記事ですが、以下のようなものが参考になると思います。 http://roadtomachinelearning.blogspot.com/2018/10/mingwopencv.html
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.34%

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

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

質問する

関連した質問