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

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

ただいまの
回答率

90.22%

ヘッダファイルなしでコンパイルしたい。

受付中

回答 4

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,543

carnage0216

score 133

環境
Windows10 64bit
vs2015(開発用コマンドプロンプトのみ)
OpenCV-MinGW-Buildhttps

このサイトhttp://d.hatena.ne.jp/Inuneco/20110714/p1に書いてあるopencvのプログラムをヘッダファイルなしで書き直したいのですが、どのようにすればよいでしょうか?

#include <cv.h>
#include <highgui.h>
int main () {
cvNamedWindow ("test", CV_WINDOW_AUTOSIZE);
cvWaitKey (0);
cvDestroyWindow ("test");
return 0;
}

私個人で書いたものはこちらです。
できる限りopencvの参考書とc言語の参考書で頑張ったのですが最後のエラーが解決できずにいます。

#define cvNamedWindow;
int cvNamedWindow( const char* name, int flags CV_DEFAULT(CV_WINDOW_AUTOSIZE) );
CV_WINDOW_AUTOSIZE     = 0x00000001;//the user cannot resize the window, the size is constrainted by the image displayed
int main () {
cvNamedWindow ("test", CV_WINDOW_AUTOSIZE);
cvWaitKey (0);
cvDestroyWindow ("test");
return 0;
}


エラーがこちらです。

C:\Users\Daito\Desktop\NamedWindow.c:3:22: warning: ISO C99 requires whitespace after the macro name
 #define cvNamedWindow;
                      ^
C:\Users\Daito\Desktop\NamedWindow.c:4:1: warning: useless type name in empty declaration
 int cvNamedWindow( const char* name, int flags CV_DEFAULT(CV_WINDOW_AUTOSIZE) );
 ^~~
C:\Users\Daito\Desktop\NamedWindow.c:4:20: error: expected identifier or '(' before 'const'
 int cvNamedWindow( const char* name, int flags CV_DEFAULT(CV_WINDOW_AUTOSIZE) );
                    ^~~~~
C:\Users\Daito\Desktop\NamedWindow.c:5:1: warning: data definition has no type or storage class
 CV_WINDOW_AUTOSIZE     = x00000001;//the user cannot resize the window, the size is constrainted by the image displayed
 ^~~~~~~~~~~~~~~~~~
C:\Users\Daito\Desktop\NamedWindow.c:5:1: warning: type defaults to 'int' in declaration of 'CV_WINDOW_AUTOSIZE' [-Wimplicit-int]
C:\Users\Daito\Desktop\NamedWindow.c: In function 'main':
C:\Users\Daito\Desktop\NamedWindow.c:11:1: warning: implicit declaration of function 'cvWaitKey' [-Wimplicit-function-declaration]
 cvWaitKey (0);
 ^~~~~~~~~
C:\Users\Daito\Desktop\NamedWindow.c:13:1: warning: implicit declaration of function 'cvDestroyWindow' [-Wimplicit-function-declaration]
 cvDestroyWindow ("test");
 ^~~~~~~~~~~~~~~


どうかよろしくお願いいたします。

ヘッダファイルなしのプログラムにこだわるのはヘッダファイル 自体に無駄が多いため、ソースコードとは関係ないものでエラーを出すためです。cc~~~~

出来れば解決までの過程なども教えていただけると助かります。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • 退会済みユーザー

    2018/04/13 13:45

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

  • YomogiKOBO

    2018/04/13 15:11

    マルチポスト https://dixq.net/forum/viewtopic.php?f=3&t=20108

    キャンセル

回答 4

+14

ヘッダファイルなしのプログラムにこだわるのはヘッダファイル 自体に無駄が多いため、ソースコードとは関係ないものでエラーを出すためです。c~~~~ 

自身の不理解を棚に上げてエラーが出るのはヘッダーのせいだなどと批判するのは、OpenCVの作者に対して失礼というものです。作者に対する敬意が微塵も感じられません。

エラーが出るのは使い方が間違っているからです。

OpenCVを満足に使えるようになるまでは、無理に自分でビルドしようとせずに、まずはビルド済みのパッケージを利用し、ドキュメントをしっかりと読み込むことをお勧めします。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/17 17:55

    epistemeさん、今更で申し訳無いのですが、先程見直しとしてvsでcvNamedWindownにポインタを重ねると関数定義が見つかりませんと出てきました。
    質問なのですが、cv Name Windowの見つからない定義自体もソースコードに書き込めばopencv world.libを使わなくてもビルドできるわけですよね?
    実装するつもりはないですが、理論が正しいか聞きたいです。

    キャンセル

  • 2018/04/17 19:07

    YES.

    キャンセル

  • 2018/04/17 19:10

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

    キャンセル

+6

こうですかねぇ。

int cvNamedWindow( const char* name, int flags );
void cvWaitKey (int);
void cvDestroyWindow (const char*);
#define CV_WINDOW_AUTOSIZE 0x00000001
int main () {
    cvNamedWindow ("test", CV_WINDOW_AUTOSIZE);
    cvWaitKey (0);
    cvDestroyWindow ("test");
    return 0;
}


書き忘れてたので追記します。

ヘッダファイルなしのプログラムにこだわるのはヘッダファイル 自体に無駄が多いため、ソースコードとは関係ないものでエラーを出すためです。

エラーが出るのは必要なインクルードを十分にしていないからです。
OpenCVのようなきちんとした配布物でエラーが出るなんてありえないです。
なのでマニュアルなりサンプルなりを良く理解して使うようにしてください。
またあなたがヘッダーファイルを独自に改変して使うのは構わないですが、バージョンアップやアップデートがあった場合、あなたはまたヘッダーファイルを解析して必要な部分のみを抜き出す作業をしないといけません。
そんな無駄な作業をするのであれば、前述どおり使い方を良く理解して、エラーが出ないコードを書くべきです。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/13 14:00

    >>マニュアルなりサンプルなり
    やっていても出来ないとなると私は日本語がちゃんと理解出来ていないのだと思いました。

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

    キャンセル

  • 2018/04/13 20:00

    てか件のサイトにあるやつは OpenCV 2.1 だぞ。バージョンの違いによる問題ではないことを確認したのか?

    キャンセル

  • 2018/04/13 20:13

    ごめんなさい。少しお待ちください。

    キャンセル

  • 2018/04/14 10:13

    ...で、どうだった? 僕とこでは OpenCV 3.4.1 でもコンパイルできることを確認したぞ。

    キャンセル

+2

#includeでヘッダファイルを取り込み(インクルード)している部分を、ヘッダファイルの中身で置き換えてゆく。

置き換えたヘッダファイルの中に#includeがあれば、それもヘッダファイルの中身で置き換える。

この作業を#includeが無くなるまで繰り返せば、全ての取り込まれるべきヘッダファイルがソースコードに含まれることになり、ヘッダファイルは不要になります。

長大なヘッダファイルの内容がソースコードの最初に挿入されますから、読みやすくはないと思いますが。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/13 14:05

    基礎を勉強し直します。
    どうもありがとうございました。

    キャンセル

  • 2018/04/14 10:15

    #includeをすべて展開してくれる機能は gcc, vc++ 共にあります。手作業でやる必要なし。

    キャンセル

+2

https://www.amazon.co.jp/dp/B00EYXMA6Q/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

これは比較的難しい本ですが、ヘッダーファイルを用いるモチベーションが書かれています。
たまに日本語が変ですが、翻訳本によくあることなので大目に見てやってください。

ヘッダーファイルを使わなくても、プログラムが動くために必要な実装は変わりません。

ライブラリは面倒くさい実装を自分でやらなくてもいいようにしたものという認識があれば、今回のような質問が出ないかと思います。

本来のオブジェクト指向から逆行するにはまだプログラミング経験が足りないように見受けられます。

まずはマニュアルをなぞってはいかがでしょうか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/14 00:50

    どうもありがとうございます。
    初めて見ました。少し高いですが、購入を考えます。
    ちなみにmkgreiさんはお持ちでしょうか?

    キャンセル

  • 2018/04/14 01:07

    電子版で読みました。
    固定レイアウトなので、端末が小さいと読みにくいかもしれません。

    内容としてはAPIのためのデザインなので、opencvのようなライブラリ開発側の立場からみたクラスの設計方針などが内容です。

    カプセル化と隠蔽についての設計思想が述べられていて、ライブラリを変な使われ方をされないようにするためにどうすれば良いのかについて議論があった記憶があります。

    少々高いので簡単には手が出ませんが、使用者以外の視点を持ってコードをみる視点を感じ取ることができるかもしれません。

    キャンセル

  • 2018/04/14 16:39

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

    キャンセル

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

  • ただいまの回答率 90.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

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