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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

OpenCV

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

MinGW

MinGW(ミン・ジー・ダブリュー)は GNUツールチェーンのWindows移植版です。 ランタイムライブラリと開発ツールで構成されています。

Q&A

4回答

1220閲覧

opencvでgcc用のライブラリを作りたい。

carnage0216

総合スコア194

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

OpenCV

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

MinGW

MinGW(ミン・ジー・ダブリュー)は GNUツールチェーンのWindows移植版です。 ランタイムライブラリと開発ツールで構成されています。

0グッド

0クリップ

投稿2018/04/12 08:44

編集2018/04/12 19:25

環境
Windows10 64bit
gcc(mingw)
opencv3.4.0

opencvのライブラリはvsようであるためgccでは使えません。
なので、opencvのライブラリをgccで使えるようにするために、ライブラリの元となるソースコードcoreのソースコードの一つalgorithm.cppをgccでコンパイルしようとしたのですが、途中からgithubに載っていないヘッダファイルが出現したため困っています。

algorithm.cppの中身です。

/*M/////////////////////////////////////////////////////////////////////////////////////// // // IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. // // By downloading, copying, installing or using the software you agree to this license. // If you do not agree to this license, do not download, install, // copy or use the software. // // // License Agreement // For Open Source Computer Vision Library // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. // Copyright (C) 2009-2011, Willow Garage Inc., all rights reserved. // Third party copyrights are property of their respective owners. // // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: // // * Redistribution's of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // // * Redistribution's in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // // * The name of the copyright holders may not be used to endorse or promote products // derived from this software without specific prior written permission. // // This software is provided by the copyright holders and contributors "as is" and // any express or implied warranties, including, but not limited to, the implied // warranties of merchantability and fitness for a particular purpose are disclaimed. // In no event shall the Intel Corporation or contributors be liable for any direct, // indirect, incidental, special, exemplary, or consequential damages // (including, but not limited to, procurement of substitute goods or services; // loss of use, data, or profits; or business interruption) however caused // and on any theory of liability, whether in contract, strict liability, // or tort (including negligence or otherwise) arising in any way out of // the use of this software, even if advised of the possibility of such damage. // //M*/ #include "precomp.hpp" namespace cv { Algorithm::Algorithm() { CV_TRACE_FUNCTION(); } Algorithm::~Algorithm() { CV_TRACE_FUNCTION(); } void Algorithm::write(const Ptr<FileStorage>& fs, const String& name) const { CV_TRACE_FUNCTION(); if(name.empty()) { write(*fs); return; } *fs << name << "{"; write(*fs); *fs << "}"; } void Algorithm::save(const String& filename) const { CV_TRACE_FUNCTION(); FileStorage fs(filename, FileStorage::WRITE); fs << getDefaultName() << "{"; write(fs); fs << "}"; } String Algorithm::getDefaultName() const { CV_TRACE_FUNCTION(); return String("my_object"); } void Algorithm::writeFormat(FileStorage& fs) const { CV_TRACE_FUNCTION(); fs << "format" << (int)3; } } /* End of file. */> 引用テキスト

こちらがエラーコードです。

0\modules\core\src\algorithm.cpp In file included from D:\opencv-3.4.0\modules\core\src\precomp.hpp:55:0, from D:\opencv-3.4.0\modules\core\src\algorithm.cpp:43: c:\mingw\include\opencv2\core\private.hpp:48:4: error: #error this is a private header which should not be used from outside of the OpenCV library # error this is a private header which should not be used from outside of the OpenCV library ^~~~~ In file included from c:\mingw\include\iw++\iw_core.hpp:27:0, from c:\mingw\include\iw++\iw.hpp:27, from c:\mingw\include\opencv2\core\private.hpp:241, from D:\opencv-3.4.0\modules\core\src\precomp.hpp:55, from D:\opencv-3.4.0\modules\core\src\algorithm.cpp:43: c:\mingw\include\iw\iw_core.h:32:23: fatal error: ippdefs_l.h: No such file or directory #include "ippdefs_l.h" ^ compilation terminated

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

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

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

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

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

guest

回答4

0

MSYS2にはGCC用のOpenCVバイナリが用意されていますので、目的がMinGW-w64 GCCでOpenCVを使いたいだけであればバイナリを使用するのが一番早いと思います。

以下、手順です。なお、MSYS2が意図しないところにインストールされないようにChocolateyを使っています。(MSYS2を既にインストールしている場合はアンインストールしておいてください。)

###インストール

  1. Chocolatey Installationのページにある方法でChocolateyをインストールします。(英語が読めない場合は、この後の説明もわからない所が出てきますので、諦めて下さい。)
  2. 管理者としてコマンドプロンプトまたはPowerShellを開きます。
  3. 次のコマンドを実行し、MSYS2をインストールします。
    cinst -y msys2
  4. "C:\tools\msys64\mingw64.exe"を実行し、MINGW64環境のMSYS2を起動します。
  5. 次のコマンドでGCCやビルド関係を入れます。
    pacman -S mingw-w64-x86_64-toolchain
  6. 次のコマンドでOpenCVを入れます。
    pacman -S mingw-w64-x86_64-opencv

###テスト

  1. "C:\tools\msys64\mingw64.exe"を実行し、MINGW64環境のMSYS2を起動します。
  2. 適当なエディタでOpenCV: contours2.cppにサンプルをコピーし、"contours2.cpp"という名前で保存します。
  3. 次のコマンドでビルド(コンパイル)します。
    g++ contours2.cpp -lopencv_core -lopencv_imgproc -lopencv_highgui
  4. "a.exe"が作られてるはずですので、実行します。
    ./a.exe
  5. サンプルのサイトにあったようなウィンドウが表示されればOKです。

###その他

配付バイナリはCUDA対応はたぶんなってないとおもいます。対応したい場合は、yumetodoさんの回答を参考にして自分でコンパイルしてください。

投稿2018/04/12 22:30

raccy

総合スコア21735

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

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

carnage0216

2018/04/13 00:13

詳しい解説、どうもありがとうございます。素直に使わせていただきます。 あの、VSにもコマンドプロンプトが存在しますが、GCCにもコマンドプロンプトが存在します。 VSのコマンドプロンプトのみを使う場合はGCCをコマンドプロンプトで使うのとほとんど変わりまないように思えます。もちろんコマンドはVSとGCCでは異なります。それ以外で何か大きな違いはあるのでしょうか?
carnage0216

2018/04/13 01:03

あの、実装とは別にあっているかの確認としてお尋ねしたいのですが、opencvはvsでしかコンパイル出来ません。gccで使うには以下の手順が必要に思えます。 vsでコンパイルした実行ファイルをobjdumpなど用いて逆アセンブルすれば、そのアセンブリプログラムがgcc専用のプログラム、すなわち、gccでアセンブラ(コンパイル)できるプログラムなのでしょうか? 仮にそうだとしても得られたアセンブリプログラムを解読するのは骨が折れそうです。 参考サイトはこちらです。 https://qiita.com/YusukeHarada/items/a1e381f624dad96aeeca
asm

2018/04/13 01:08

> opencvはvsでしかコンパイル出来ません。 んなわきゃない。MSYS2+cmakeでもビルドできた事は確認しています。
carnage0216

2018/04/13 01:35

あ、ごめんなさい。説明不足でした。opencvに付属している静的、動的ライブラリはvsでしか使えません。 なので、gccで使うにはライブラリの元になったソースコードをgccでコンパイルしなくてはいけないのですよね?と聞きたかったのです。 また、vsで得られた実行ファイルをコンパイラAで逆アセンブルします。それによって得られたアセンブリプログラムはコンパイラAでしか使えないのですよね?とも聞きたかったのです。
asm

2018/04/13 03:27

C言語版インタフェースのみを用いるならばVSでビルドされたDLLを用いる方法が無いわけじゃないな C++だと無理だが 実行ファイルを逆アセンブルしたソースがreassembleできるかは逆アセンブル時に使用したツール次第です。 また、仮にできたとして、それにリンクできるかは微妙ですね。呼び出し規約等を小細工なしには無理でしょう。
raccy

2018/04/13 11:07

> gccで使うにはライブラリの元になったソースコードをgccでコンパイルしなくてはいけないのですよね? いいえ。 MSYS2でGCC用のOpenCVが用意されているので、コンパイルする必要はありません。回答の通りに実施すれば、GCCだけでOpenCVのサンプルがコンパイルできます。
carnage0216

2018/04/13 13:09

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

2018/04/13 13:41

ちなみに、GCC用のOpenCVを作った人は地道にコンパイルして、いくつかのライブラリファイルを一つにまとめてcore.libなどにしたのでしょうか?どうやって一つにまとめたかはわかりません。 あるいは何かしらの便利なツールがあったのですか?
dodox86

2018/04/13 14:37 編集

>carnage0216 毎度横から失礼します。以前にも書いた気がしますが、無用にコメントが長くなるから違う質問を派生させるのは止めましょう。静的ライブラリ(*.lib) でも、動的ライブラリ(*.dll, *.so)でも、それ用のツール(ライブラリアン)があります。例えばVisual Studio ならlib.exe, gccのbinutils/ツールチェインならarです。
raccy

2018/04/13 15:02

yumetodoさんの回答でも紹介してある通り https://github.com/Alexpux/MINGW-packages/tree/master/mingw-w64-opencv にバイナリパッケージを作るための情報が全て載っています。 どんな風にビルドしているのかはPKGBUILDの中身を見てください。13種類のパッチを当て、cmakeでMakefile等を作成し、makeしているだけです。
carnage0216

2018/04/15 06:43

raccyさん、dodox86さん、yumetodoさん、本当にどうもありがとうございます。大変勉強になりました。
guest

0

msys2を利用しましょう。

https://github.com/Alexpux/MINGW-packages/tree/master/mingw-w64-opencv

にてPKGBUILDが配られているのでこれを利用しない手はないです。

msys2をインストールしたら、
MINGW64を開いて、

pacman -S base-devel git mingw-w64-x86_64-toolchain cmake git clone https://github.com/Alexpux/MINGW-packages.git --depth=1 cd MINGW-packages/mingw-w64-opencv makepkg -csi

でひたすらyして行けば依存ライブラリを勝手に入れてくれつつ、ビルドしてパッケージ化してインストールまでしてくれます。


ビルドすることにこだわらなければ、

bash

1$pacman -Ss opencv 2mingw32/mingw-w64-i686-opencv 3.4.0-1 3 Open Source Computer Vision Library (mingw-w64) 4mingw64/mingw-w64-x86_64-opencv 3.4.0-1 5 Open Source Computer Vision Library (mingw-w64)

prebuild binary packageが配布されているので

bash

1$ pacman -S mingw-w64-x86_64-opencv

とすれば十分です。PKGBUILDをmakepkgでビルドする方法を紹介したのは、あくまでPKGBUILDをいじってとくにffmpegのビルドをカスタマイズしたいとか(ライセンス的に配布バイナリには含められない有用なライブラリとかあるので)そういう要求かなとおもっての回答です。

投稿2018/04/12 19:48

編集2018/04/13 12:18
yumetodo

総合スコア5850

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

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

yumetodo

2018/04/12 21:05

ついさっき手元でビルドできることを確認しました。大量にwarningが出るのはご愛嬌。
guest

0

そもそも OpenCVはMinGWでビルドできるの? 確認した? ちゃんとCMake使った?
...で、目的は何なんだ? VS版OpenCVあるんでしょ? Linuxでならともかくも、なんでWindowsでgccなの?

投稿2018/04/12 10:14

編集2018/04/12 10:20
episteme

総合スコア16614

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

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

carnage0216

2018/04/12 10:37

cmakeは使いました。 OpenCVはMinGWでビルドできないです。なので、mingwでもビルドというよりコンパイルするためにライブラリのソースコードをgcc(mingw)でコンパイルしようと考えました。 ただ、コンパイルするにもソースコードの量は多く、mingw用の大量のバイナリをどうやって一つにまとめて良いのか...課題は多いです。 目的はgcc(mingw)でopencvを使うためです。 pcのosがWindowsであるためです。
episteme

2018/04/12 12:05

やりたいのを止めることはできんがな。 僕はお役に立てそうにない。
carnage0216

2018/04/12 15:08

似ていますが、違いますね。参考になるかもしれないのでこれは見させていただきます。
carnage0216

2018/04/12 15:10

ちなみに知恵袋は数か月前までやってましたが今はほとんどやっていません。
guest

0

iw_core.hを見てみると
※"#"があるとみにくくなるようなので #を省略。。#ifdef ~#endif

#ifdef ICV_BASE include "ippicv.h" #else include "ippcore.h" #endif

コンパイル時ICV_BASEが付与されちる場合、ippicv.hがインクルードされ
ippicv.hには

#include "ippicv_l.h" #include "ippicv_defs.h" #include "ippicv_types.h" #include "ippicv_redefs.h" #include "ippversion.h"

とありますね。
ICV_BASEを無効にするか不足しているヘッダファイルなどを入手する事をおすすめします。

投稿2018/04/12 15:39

編集2018/04/13 02:47
YomogiKOBO

総合スコア187

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

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

carnage0216

2018/04/12 19:26

どうもありがとうございます。 とりあえずはICV_BASEを無効にする方針で進ませていただきます。
carnage0216

2018/04/12 19:32

ちなみになぜiw_core.hに着眼点を置いたのでしょうか?
raccy

2018/04/12 21:46

プログラミングのコードは前後の行に ``` をつけてください。#があっても見出しドーン!になりません。該当部分を選択して「</>」を押すことでも可能です。回答欄もMarkdownの亜種なので、Markdownに従って書くと、読みやすくわかりやすい回答を書くことができます。
YomogiKOBO

2018/04/13 02:49

raccyさんありがとうございます。さっそく修正いたしました。 > ちなみになぜiw_core.hに着眼点を置いたのでしょうか? 提示されておられるコンパイルエラーメッセージから関連するインクルードファイルを調べただけです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問