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

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

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

CMakeはクロスプラットフォームで作動するオープンソースのビルドシステムです。コマンドライン又は組み込まれた開発環境で使うことができる元のmakefileとプロジェクトファイルを生成します。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

OpenCV

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

Q&A

解決済

1回答

8485閲覧

OpenCVをCMakeで自前ビルドしたときのパス通しについて

jty4k

総合スコア19

CMake

CMakeはクロスプラットフォームで作動するオープンソースのビルドシステムです。コマンドライン又は組み込まれた開発環境で使うことができる元のmakefileとプロジェクトファイルを生成します。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

OpenCV

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

0グッド

0クリップ

投稿2015/12/11 09:07

編集2015/12/15 01:18

お世話になります。
初歩的ではありますが今までごまかしながら使っており、正しい(スマートな)やり方をはっきりさせたいと思ったので、質問させていただきます。

###前提としている環境
OS :Windows7 64bit
CMake :3.3.2
OpenCV:3.0.0
開発環境:Visual Studio Community 2013

###質問内容
OpenCVをCMakeで自前ビルドした場合の、インクルード先をスマートに設定する方法を知りたいです。
設定方法について検索をかけるといろいろと情報は出てくるものの、何が正しいのかが分からなくなってしまいました。

OpenCVを導入する際、予めビルドされたものを使う場合は、システム環境変数の設定を1点、プロジェクトの設定を2点、下記のように設定すればシンプルに済むと思います。
(OpenCVをCドライブ直下に置いているとします。
また、ソースコード中でpragma commentを使ってライブラリをリンクしています。)
・変数Pathの値に下記を追加
⇒C:\opencv\build\x64\vc12\bin
・構成プロパティ>C/C++>全般>追加のインクルードディレクトリ に下記を追加
⇒C:\opencv\build\include
・構成プロパティ>リンカー>全般>追加のライブラリディレクトリ に下記を追加
⇒C:\opencv\build\x64\vc12\lib ※12/15誤記を修正

しかしCUDAと合わせて使う場合などは自前でCMakeを使ってビルドする必要があると認識しております。
自前でビルドした場合、ビルドされたフォルダをみると、インクルードファイルやライブラリファイルが点在しており、
① 点在しているすべてのフォルダにパスを通す
② 点在するファイルを一つのフォルダにまとめ、1つだけパスを通す
…のどちらかをする必要があると考えております。

例えばworkフォルダへビルドした場合、ライブラリファイルは

C:\opencv\work\lib
だけでなく
C:\opencv\work\3rdparty\lib
にもあります。

<質問①>
個人的には上記②がスマートだと考えておりますが、邪道なやり方だったりするのでしょうか。
(動けばいいだろ!邪道かどうかなんてこまけぇこたぁ気にすんな!という声が聞こえてきそうですが...)

<質問②>
また、予めビルドされた方のフォルダを見ながらすればよいのでしょうが、ファイル数が多く結局どのファイルが必要なのかがいまいち理解できておりません。
必要なファイルはどれで、どこにおいておるのでしょうか。
(フォルダ名がそれっぽい名前なのにCMakeで使ったファイルが置いてあるだけだったりと、非常にわかりにくいです。
一つ一つ検索をかけるのもなんだかなぁと感じています。)

スマートなやり方、自分はこれが正しいと信じている方法だ、などありましたら、ご教示いただきたく宜しくお願いいたします。
(割と根本から何か誤解している可能性もあるので、その場合はご指摘のほどお願いいたします。)

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは。

恐らく、正式な使い方は「OpenCVのビルド・システムに指示して②を行う」だと思います。

Visual Studioのビルド・メニュー→バッチ ビルド(T)でALL_BUILDとINSTALLにチェックし、そのダイアログの「ビルド」ポタンを押してビルドすると、ビルド・フォルダ\installの下にコピーされます。
なお、CMakeでConfigureする時デフォルトのままの場合、BUILD_SHARED_LIBSがチェックされているため、dllをビルドしてインストールするようです。ですが、3rdPartyのライブラリはdllには対応していないようでデフォルトではinstallへインストールされませんでした。
BUILD_SHARED_LIBSをアンチェックしてConfigureしたソリューションを使えばinstall\staticlibへインストールされました。

OpenCVをShared Buildして3rdPartyのライブラリを使いたい場合は、手でビルド・フォルダ\install\staticlibへコピーすることが次善の策のように思います。

因みにインストール先を変更したい場合は、CMAKE_INSTALL_PREFIXで変更できます。
デフォルトではビルド・フォルダ\installになっています。

投稿2015/12/14 10:18

編集2015/12/14 10:25
Chironian

総合スコア23272

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

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

jty4k

2015/12/15 01:57

回答いただき、ありがとうございます。 ご教示いただいた手順を確かめたところ、確かに同じ挙動をしました。 あらためてわかったこと・改めて疑問に思ったこと等をまとめて書こうと思います。 可能であれば再度ご教示いただきたく存じます。 (初歩的なこともまぎれておりますがご容赦ください) ○理解したこと ・バッチビルドの際に「INSTALL」にもチェックを入れて初めてCMAKE_INSTALL_PREFIXで指定したフォルダにコピーがインストールされる。  (\installに指定したはずなのにフォルダすら生成されないのに疑問を持っていた) ・BUILD_SHARED_LIBSのチェックをON/OFFすることでDLLとLIBを選択的に生成することができる。  (そもそもDLL=シェアードライブラリであることの認識を持っていなかった) ・3rdPartyのライブラリはDLLに対応しておらず、LIBの形でのみ使用可能。  (理由は不明) ・自分がOpenCVのライブラリをDLLとして使いたいのか、LIBとして使いたいのかをはっきりさせてビルドする必要がある。 ○改めて疑問に思ったこと ①BUILD_SHARED_LIBSのチェックをONにしてビルドした場合、\install\x64\vc12\bin にDLL、\install\x64\vc12\libにLIBが生成されますが、これは「どちらのライブラリも使える状態」ということなのでしょうか。 ②「①」が正しい場合、どちらのライブラリを使ってプログラムをビルドするのか、というのはどこで指定するのでしょうか。  (libフォルダにパスを通さず、binとstaticlibのみパスを通せばDLLを指定できる?) 以上、宜しくお願いいたします。
Chironian

2015/12/15 02:55

こんにちは。 > ①BUILD_SHARED_LIBSのチェックをONにしてビルドした場合、\install\x64\vc12\bin にDLL、\install\x64\vc12\libにLIBが生成されますが、これは「どちらのライブラリも使える状態」ということなのでしょうか。 このlibフォルダにあるlibファイル群は、binフォルダにあるDLLと「暗黙的にリンク」するためのインポート・ライブラリです。ですのでDLLと一緒に用います。 http://exlight.net/devel/windows/dll/windll.html まとめますと、 1)OpenCVをDLLにて暗黙的リンクで使う場合 BUILD_SHARED_LIBSのチェックをONにしてビルドし、ビルド・フォルダ\install\x64\libのlibファイルをリンクする。 3rdPartyについては、ビルド・フォルダ\3rdparty\lib\DebugとReleaseのlibファイルをリンクする。 ビルド・フォルダ\install\x64\staticlibにも1つライブラリができているので、これを使う場合はこのリンク指定も必要。 つまり、4箇所のライブラリ・フォルダを追加指定する。 2) OpenCVをDLLにて明示的リンクで使う場合 BUILD_SHARED_LIBSのチェックをONにしてビルドし、特にlibファイルはリンクせず、LoadLibrary()、GetProcAddress()等を用いて自力でダイナミック・リンクする。 3rdPartyについては1)と同様。 3) OpenCVを静的リンクで使う場合 BUILD_SHARED_LIBSのチェックをOFFにしてビルドし、install\x64\staticlibのlibファイルをリンクする。 ついでに、静的リンクする場合は、大抵、VCの標準ライブラリも静的リンクへ切り替えておかないとうまく行きません。プロジェクトのプロパティのC/C++→コード生成→ランタイムライブラリで設定できます。
jty4k

2015/12/15 06:04

早々の再回答ありがとうございます。 改めて疑問に思ったことについても丁寧に回答くださり、ありがとうございます。 特に「暗黙的/明示的な」DLLの使用などは特に知見がなく、ライブラリ関連について非常に勉強になりました。 実際に各方法を試してみたいとおもいます。 ご教示いただき、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問