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

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

ただいまの
回答率

90.76%

  • C

    3450questions

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

  • C++

    3245questions

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

  • OpenCV

    966questions

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

opencv_world320.libというライブラリなしでビルドしてみたい。好奇心故の質問で申し訳ありません。

解決済

回答 10

投稿

  • 評価
  • クリップ 0
  • VIEW 783

carnage0216

score 120

環境

  • windows10 64bit
  • VS2017
  • opencv3.2.0 
    以下のプログラムは動画を読み込んでエッジを出力するプログラムです。
    プログラムの本題とは変わるのですが、プログラムに書いてあります
#pragma comment(lib, "opencv_world320.lib")

なしでビルドするにはどうすればよいでしょうか?
opencv_world320.libの基となったソースコードをコピペすれば済むのでしょうか?
そうだとしても余計なものも入ってしまい、あまり賢いとは言えません。最低限のプログラムだを書き加えることでopencv_world320.libを使わなくても済むようにしたいのですが、何か助言を頂けないでしょうか?
私も文字検索などで無駄を取り除いて必要な部分のみでプログラムが組めないかを試行錯誤しております。
どうかお力を貸していただけないでしょうか?

#include <opencv2\opencv.hpp>

#pragma comment(lib, "opencv_world320.lib")

int main()
{
    cv::VideoCapture capture("C:\\Opencv3.2.0\\opencv\\sources\\samples\\data\\Megamind.avi");
    int width = (int)capture.get(CV_CAP_PROP_FRAME_WIDTH);
    int height = (int)capture.get(CV_CAP_PROP_FRAME_HEIGHT);
    int count = (int)capture.get(CV_CAP_PROP_FRAME_COUNT);
    int fourcc = (int)capture.get(CV_CAP_PROP_FOURCC);
    double fps = capture.get(CV_CAP_PROP_FPS);

    cv::VideoWriter writer("out.avi", fourcc, fps, cv::Size(width, height), false);

    while (true)
    {
        cv::Mat frame;
        capture >> frame;
        if (frame.empty())
            break;

        cv::Mat edge;
        cv::Canny(frame, edge, 50, 150);

        writer << edge;
    }

    return 0;
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • 退会済みユーザー

    2018/04/25 19:40

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

回答 10

checkベストアンサー

+7

#pragma comment(lib, "opencv_world320.lib")
なしでビルドするにはどうすればよいでしょうか?

  1. その #pragma 行を削除してbuildする。おそらく大量のリンク・エラーを目にすることになる。"関数xxxがどこにもない"ってエラーをね。

  2. そのうちひとつを選び、opencvコードから探し出して~.cpp に貼りつけ再build、コンパイル・エラーが出たら修正する。やがてコンパイル・エラーが消えてもリンク・エラー:"関数xxxがどこにもない"が残るだろう。

  3. ひたすら(2)を繰り返す(おそらく数十~数百回)。必要なすべての関数が~.cppに貼りつけられたとき、エラーはなくなり実行できる。

やりたいなら止めはしない。
数個やったところで時間の空費に気づくはずだし、そもそもこの作業を行うスキルはあなたには無いはずだ。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/25 14:45

    一番現実的な手順ですね。

    キャンセル

  • 2018/04/25 14:49

    安直には、リンク・マップを出力すれば必要な関数etc.のシンボルが全部手に入りますな、やらんけど。

    キャンセル

  • 2018/04/25 15:58

    解答ありがとうございます。
    >>リンク・マップを出力すれば必要な関数etc.のシンボルが全部手に入ります
    ソースコードに必要なライブラリをすべて表示するとい意味でしょうか?

    キャンセル

  • 2018/04/25 16:07

    調べろや。勉強してんだろ?

    キャンセル

  • 2018/04/25 18:01

    はい、調べます。

    キャンセル

+7

見えている範囲の自分のコードから、必要な部分を抜き出して質問することも必ずしもうまくできていない状態で、他人の書いた大規模のコードから必要最低限の部分を抜き出すのは至難のワザです。

ちなみに質問するためのコードを抜き出すことができるようになると、質問する必要性もなくなるというジレンマを抱えています。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/24 22:56

    自分の場合、「質問しようと状況整理している」段階で、8割方解決してしまう気がします。

    キャンセル

  • 2018/04/24 23:14

    その感覚わかります。
    そして問題を特定さえできれば後は過去に誰かが同じ境遇になったことがあるので解決しちゃうことが多いですよね。

    残りものは厄介で…

    キャンセル

+5

#pragma comment(lib)は、「どのライブラリを使うか」という指示なので(MSDN)、ソースコードに書く代わりにビルド時のオプションで指定する形でも処理ができます。

なお、

文字検索などで無駄を取り除いて必要な部分のみでプログラムが組めないかを試行錯誤しております。

「既成のライブラリを外してビルドしよう」という努力が、(プログラムサイズやライセンスなど、そのまま採用できない理由があるのでなければ)いちばん無駄ではないかと思います。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/24 22:40

    好奇心を持つことは決して悪くないことですが、この質問のような方向に進んでいっても、実用的なプログラムを作るという観点からはあまり役に立たないです。

    キャンセル

  • 2018/04/25 11:12

    正しい道に進むのは大変ですね。過ちを繰り返してばかりです。

    キャンセル

+5

#pragma comment(lib, "opencv_world320.lib")


なしでビルドするにはどうすればよいでしょうか?

リンカ(linker)オプションの依存ライブラリに、直接 opencv_world320.lib を指定する方法があります。本来は#pragma 〜記法が代替手段にすぎず、リンカオプションへの指定が本流です。

opencv_world320.libの基となったソースコードをコピペすれば済むのでしょうか?
最低限のプログラムだを書き加えることでopencv_world320.libを使わなくても済むようにしたいのですが、何か助言を頂けないでしょうか?

理論上は「opencv_world320.libの基となったソースコードをコピペすれば済み」ます。現実的には馬鹿げた手段と言わざるを得ません。

ソースコード丸ごとのコピー&ペーストを避けるための手段が、「コンパイル済みライブラリ(opencv_world320.lib)とのリンク」に相当します。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+5

無駄を取り除いて必要な部分のみでプログラムが組めないか

ライブラリ内の関数/変数の中から使ってるもののみを拾ってくるのがリンカなんだが。

ひょっとして ~.lib のナカミ全部がリンクされると思ってる?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/25 11:10

    はい、思っています。
    まさか、違うのですか!?
    では動的ライブラリに関してはすべてリンクされず、必要な部分だけリンクされているのですか?

    キャンセル

  • 2018/04/25 11:33 編集

    動的ライブラリの場合関数の実体はDLLにあって、~.exe にはそいつとの"(小さな)繋ぎ"の部分しかリンクされない。
    静的ライブラリの場合関数の実体は~.exeに同梱されるが、直接/間接的に使われているものだけ。そうじゃないと~.exeが肥大するやんか。

    キャンセル

+5

おそらくそのライブラリのほとんどが不要なコードで、それを削ぎ落とすことで短く分かりやすいものになると思っているのでしょう。

ではこうしてみてください。
まず必要最小限のコードを opencv_world320.lib を使ってコンパイルし、実行可能ファイルを作ります。
次にそれを逆アセンブルし、得られたソースを保存します。
これで必要な物だけで構成されたソースが出来上がります。
しかも苦手な C++ ではなく得意なアセンブラです。最高でしょう?

それで、できたものを実際に読んでみてください。あまりの難解さと量の多さに驚くかもしれません。

ソースというものは人間が読みやすいように作るものです。コンピューターにとっては無駄な物でも、人間が読みやすくするために必要だから入っています。削ぎ落としたら読みやすくなるかと言えば決してそんなことはありません。

可読性を上げて無駄を省く作業をリファクタリングと言い、それには知識と技術が必要です。ソースの内容を理解していない人ができる作業ではありません。

理解しやすくするために理解できないものをリファクタリングしたいという質問には、無理とお答えします。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+4

無駄を取り除いて必要な部分のみでプログラムが組めないかを試行錯誤しております。

ライブラリの中にある見えない部分をどうして気にする必要があるのでしょうか。
むしろ必要な処理だけを取り出し可視化したら、それこそ読みづらい可読性の悪いコードしか出来上がらないと思います。
ライブラリ製作者はユーザーが最低限のコーディングで済む様に、部品化して提供しているのに、それを使わないなんてライブラリ製作者に失礼です。
先日のヘッダーの件から、どうも考え方が間違ってるのですが、どうしてしまったのでしょうか。
https://teratail.com/questions/121654

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/25 11:08

    失礼な事だとは気づかず愚かな行為をしました。
    一度、静的や動的ライブラリの使わないプログラムを書いて見たかっただけです。
    世間一般からしたら理解されないのも当然です。

    キャンセル

  • 2018/04/25 11:16

    「静的や動的ライブラリの使わないプログラム」を書いてみたいのであれば、MS-DOSでBIOSを直接叩く、あるいはワンチップマイコンで動かすプログラムを書く、などがいちばん現実的です。

    通常のC言語環境では、「標準Cライブラリ(libc)」というライブラリを使う形となります。

    キャンセル

+4

opencv_world320.libの基となったソースコードをコピペすれば済むのでしょうか?

そんな単純な話ではありません。

最低限のプログラムだを書き加えることでopencv_world320.libを使わなくても済むようにしたいのですが、何か助言を頂けないでしょうか?

今のあなたでは無理です。

OpenCVのような巨大なシステムともなればソースコードの量も膨大ですし、モジュール間の依存関係も複雑でしょうから、その中で最小限必要なソースを選り分けるだけでも大変な作業となります。大量のビルド設定(Configure)の指定も適切に行わないとビルドが通りませんし、通ったとしても正しく動かない可能性があります。正式なビルド手順ではないので、ちゃんと動くかどうかの検証作業も必要です。

それらを自力で解決できるなら、そもそも質問などしないでしょう。質問するということは自力では解決できないということです。そして、それができるほどの上級者は、そんなことはしない(したがらない)し、そうする価値などないことを理解しているので、質問しても満足な回答は得られないでしょう。

OpenCVを使うなら正式なビルド手順を踏んでください。ビルド済みのパッケージで満足できないのなら、同梱のCMake設定ファイルで所望の構成のプロジェクトを生成し、それでビルドしたものを使ってください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/25 11:02

    適切なご意見、どうもありがとうございます。
    あの「モジュール間の依存関係も複雑でしょうから」との事ですが、opencvなどのプログラムを組み込む場合も依存関係などを知らないと組み込みはできないのでしょうか?

    キャンセル

  • 2018/04/25 11:31

    ここでいうモジュール間の依存関係とはOpenCVのビルドにおける内部的な依存関係のことなので、通常利用者が気にすることはありません。CMake設定ファイルを使ってプロジェクトを生成すれば、その時点で解決済みとなります。
    ただし、ビルド方法によってはopencv_world○○○ではなく機能毎に個別のライブラリーが作成されるので、利用にあたっての依存関係(あるクラスを利用する際はどのヘッダーをインクルードし、どのlibファイルをリンクする必要があるのかといった情報)は知らないといけません。ドキュメントに書いてあるとは思いますが。

    キャンセル

+4

あなたが思っているよりも(VisualStduioの)C++コンパイラ/リンカは賢いです。
リンク時に未使用の(非メンバ)関数は削除されるので無駄がどうこう考える必要はありません。
そんな事を考える時間こそ無駄です。

gccの場合はリンク時最適化を有効化する事などで削除される事を確認しました。
まぁ、objectファイル単位くらいでリンクされる事は期待できるらしいですので
組み込みみたいなハードな環境じゃない限り問題にはならないでしょうね。
数百kbを捻出する必要のある環境でOpenCVがマトモに動かせるとは思いませんが


一応、1ソースに纏めるための原理・手順だけ解説すると

  1. まずOpenCVのソースファイル全てのプリプロセス済みソースをなんとかして手に入れる
    (OpenCVの規模だと数GBから数TB程度でしょうか)
  2. 対象のソースにヘッダファイルをインクルードせずにコンパイラを通してみる。
  3. コンパイルリンクエラーから必要な関数もしくは変数・クラスを特定し、1.で入手したソースから探してコピペ
  4. 再度コンパイルし3.へ戻る

こんなのは人間がやる作業ではないですね

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/25 10:57

    どうもありがとうございます。
    確かに、コンパイラが最適化するならば必要ないですね。
    確かに、載せていただいた方法を実行すればライブラリを使わずにソースコードのみで実行ファイルがつくれますね。
    あの、実行する気は無いのですが、動的ライブラリを使わずにソースコードのみで済ます事は出来るのでしょうか?
    動的ライブラリとなるソースコードをあらかじめソースコードにコピペするなり必要な部分だけ書き込むなどすれば良いと私は考えています。
    どうかよろしくお願いします。

    キャンセル

  • 2018/04/25 12:46

    静的リンクでもよければソースコードコピペで問題ないですね。
    問題は動的リンクである必要がある場合なのですが
    ソースコードの軽微な修正では無理でしょう。

    動的リンクを半分自前で実装する事で全く同じとは行きませんが同様の事は可能です。

    キャンセル

+3

こんにちは。

リンクしているものが静的リンク・ライブラリならリンカが不要なものを削ぎ落としてくれる筈ですよ。

opencv_world320.libの基となったソースコードをコピペすれば済むのでしょうか?

必要なものだけをコピペすればよいですが、ひたすら退屈でミスしやすい単純作業の繰り返しになります。そのような機械的な作業はコンピュータに任せるのが一番です。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

  • 解決済

    動画から静止画切り出し

    動画から静止画の切り出しをしたいと考えています。 しかし、参考になるサイトを探していても見つかりません。 opencvで動画から静止画を切り出すことは不可能なのでしょうか?

  • 受付中

    【OpenCV】動画ファイル(.MOV)の保存に失敗します

    opencvで拡張子が.MOVまたは.mp4の動画ファイルを読み込み,そのまま出力するスクリプトをテスト用に作成しました. しかし,保存された動画ファイルを再生しようとしても「エ

  • 解決済

    カメラ画像の一時停止 再開

    OpenCVでカメラ画像を取得させたものに、キーのボタンを押したときに一時停止となり、その画像を画像処理し、また違うキーのボタンを押したときに画像取得が始まるようにすることは可能で

  • 解決済

    wxPythonにおいて、USBカメラの画像表示をしたい

    前提・実現したいこと ここ一週間くらい、teratailの皆様の力を借りながら、python上で動く動画や画像を表示できるGUIを作っています。画像は何とか表示でき、画像とパネル

  • 解決済

    opencv 動画 再生

    #include <stdio.h> #include <cv.h> #include <highgui.h> int main(int argc, char* argv[])

  • 解決済

    SaliencyMapの動画を保存したい

    前提・実現したいこと こんにちは。 https://github.com/akisato-/pySaliencyMap/blob/master/main_webcam.py 上記の

  • 解決済

    OpenCVを使って動画の書き出しができない

    aviファイルを読み込み,1フレームずつ間隔をSleep関数を用いて変化させて再生速度を変えるプログラムを作っています. 0倍速,等倍速,2倍速,3倍速,4倍速,5倍速の速度を行き

  • 受付中

    openCVを使った画素値取得とその座標の保存方法

    前提・実現したいこと 私は今、androidstudioでJavaとopencvを使って 画像認識を利用したアプリを開発しています。 その中でImgproc.GaussianB

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

  • C

    3450questions

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

  • C++

    3245questions

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

  • OpenCV

    966questions

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

  • トップ
  • C++に関する質問
  • opencv_world320.libというライブラリなしでビルドしてみたい。好奇心故の質問で申し訳ありません。