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

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

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

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

OpenCV

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

C++

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

Q&A

解決済

10回答

1332閲覧

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

carnage0216

総合スコア194

C

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

OpenCV

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

C++

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

0グッド

0クリップ

投稿2018/04/24 13:24

環境

  • 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;

}

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

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

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

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

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

guest

回答10

0

ベストアンサー

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

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

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

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

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

投稿2018/04/25 05:21

編集2018/04/25 05:25
episteme

総合スコア16614

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

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

mkgrei

2018/04/25 05:45

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

2018/04/25 05:49

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

2018/04/25 06:58

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

2018/04/25 07:07

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

0

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

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

投稿2018/04/24 13:54

mkgrei

総合スコア8560

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

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

maisumakun

2018/04/24 13:56

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

2018/04/24 14:14

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

0

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

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

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

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

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

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

投稿2018/04/24 23:05

Zuishin

総合スコア28660

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

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

0

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

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

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

投稿2018/04/24 22:55

episteme

総合スコア16614

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

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

carnage0216

2018/04/25 02:10

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

2018/04/25 02:34 編集

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

0

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

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

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

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

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

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

投稿2018/04/24 14:59

編集2018/04/24 15:00
yohhoy

総合スコア6191

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

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

0

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

なお、

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

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

投稿2018/04/24 13:31

編集2018/04/24 13:32
maisumakun

総合スコア145183

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

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

maisumakun

2018/04/24 13:40

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

2018/04/25 02:12

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

0

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

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


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

  1. まずOpenCVのソースファイル全てのプリプロセス済みソースをなんとかして手に入れる

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

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

投稿2018/04/25 01:34

編集2018/04/25 09:08
asm

総合スコア15147

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

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

carnage0216

2018/04/25 01:57

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

2018/04/25 03:46

静的リンクでもよければソースコードコピペで問題ないですね。 問題は動的リンクである必要がある場合なのですが ソースコードの軽微な修正では無理でしょう。 動的リンクを半分自前で実装する事で全く同じとは行きませんが同様の事は可能です。
guest

0

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

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

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

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

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

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

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

投稿2018/04/25 00:55

catsforepaw

総合スコア5938

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

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

carnage0216

2018/04/25 02:02

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

2018/04/25 02:31

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

0

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

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

投稿2018/04/24 23:58

ttyp03

総合スコア16998

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

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

carnage0216

2018/04/25 02:08

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

2018/04/25 02:16

「静的や動的ライブラリの使わないプログラム」を書いてみたいのであれば、MS-DOSでBIOSを直接叩く、あるいはワンチップマイコンで動かすプログラムを書く、などがいちばん現実的です。 通常のC言語環境では、「標準Cライブラリ(libc)」というライブラリを使う形となります。
guest

0

こんにちは。

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

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

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

投稿2018/04/24 13:41

Chironian

総合スコア23272

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問