2012-05-02 12 views
5

私は数日前にUbuntuをインストールし、apt-getを使ってbuild_essentials、opencv、highguiなどをインストールしました。g ++は4.6.1、opencvは2.1.0に見えます。ソースからopencvをビルドしてください。Ububtu、opencv、and link

私たちはopencv機能を使用するいくつかのソフトウェアを持っています。ソースファイルの名前がa.cppとb.cppのふりをしましょう。私はa.oとb.oにコンパイルし、それらを.soライブラリ(libab.soと呼ぶ)に入れます。

最後に、メインにz.cppという名前のファイルがあります。私はそこから実行可能ファイルを構築しようとしますが、cv :: stuffに大量の "未定義の参照"エラーが発生します。その後、私は(CV ::のものにそれらのすべてが)未定義の参照エラーが発生します

g++ -fPIC -g z.cpp -L../lib -lab -lml -lcvaux -lhighgui -lcv -lcxcore -o z.out 

:マイリンク行は次のようになります。

興味深いのは、私の.oファイルと直接リンクしている場合です。これはうまく機能します。これは:

g++ -fPIC -g z.cpp a.o b.o -lml -lcvaux -lhighgui -lcv -lcxcore -o z.out 

作品です。

私が読んだことはすべてこれがリンク行の問題である可能性が高いと言えますが、すべての順列の並べ替えを試みて同じ問題を抱えているので、実際には自分の問題は考えませんでしたまだ間違っている。誰でもライブラリの構築方法を知ることができます。なぜなら、ライブラリに正常に含まれている完全な.oファイルを使ってビルドした場合、ライブラリ自体でビルドできないのはなぜですか?

+0

オクラホマので、このISN:このファイルは、コンパイルのための情報をすべて格納している

/usr/local/lib/pkgconfig/opencv.pc

私はopencv 2.3.1をソースからインストールすることになりました.ffmpeg(特にv0.8!)もインストールしなければなりませんでした。だから、それは明らかにapt-getで得たopencvビルドと関係がありました。私はこれを試していないが、ソースから2.1をインストールできたと思う。まだライブラリとコンパイルする理由はよくわかりません。oは問題になるでしょうが、状況は今働いています。だから.... – daroo

答えて

3

古いCライブラリとリンクしているようです。今日のOpenCVのリンクコマンドは、-lopencv_core -lopencv_flann -lopencv_highgui...のようになります。

私は通常コアモジュールにリンクしています。順序は重要なので、アルファベット順に従ってください(モジュールを忘れないようにしてください)。

- EDIT -

あなたがOpenCVのLIBSの後に - 研究所を配置しようとしましたか?ライブラリはコマンドラインの順番でリンクされているので、これはトリックを行う可能性があります。例えば

`pkg-config --libs opencv` 

g++ myprogram.cpp `pkg-config --libs opencv` -o myprogram 

のpkg-config設定は、コンパイラにあなたのためのライブラリに関する情報を与える

+0

opencv2.1.0のものですか?私は彼らがそれを変更したことを知っているが、 "pkg-config opencv --libs"からそれらのlibsを入手しているので、それらは適切なものだと思う - また、.oファイルとリンクするとリンクするので、正しいと思った。私は、新しい方法と呼ばれるlibsの存在をチェックする。 – daroo

+0

実際のプロダクションリリースは2.3.xで、2.4.0はベータ版である。 Ubunutuはバージョンのかなり遅れているようだ。とにかく、覚えている限り、いくつかの新しいモジュールが追加されたとしても、libopencv_core、libopencv_highui、libopencv_imgproc ...は、2.xリリースでこの名前パターンを持っていました。 – sansuiso

+0

興味深い..「libopencv *」という名前のファイルはありません。/usr/libにあるファイルの名前は "libcv.so.2.1.0" "libcvaux.so.2.1.0"などです。この時点で、私は2.3.xを取得し、ソースからビルドすることがあります。if助けになる。私のソースからビルドされた.soファイルではなく、私のソースからの.oファイルにリンクすると、これはopencvの問題のようには思えません。 – daroo

12

はあなたがg ++には、以下のフラグを渡すことができます。

あなたはで見ることができます:

prefix=/usr/local 
exec_prefix=${prefix} 
libdir=${exec_prefix}/lib 
includedir_old=${prefix}/include/opencv 
includedir_new=${prefix}/include 

Name: OpenCV 
Description: Open Source Computer Vision Library 
Version: 2.3.1 
Libs: -L${libdir} -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_ml -lopencv_video -lopencv_features2d -lopencv_calib3d -lopencv_objdetect -lopencv_contrib -lopencv_legacy -lopencv_flann 
Cflags: -I${includedir_old} -I${includedir_new} 
+1

これはまさに私がやっていたことなので、私はそれがopencvまたはライブラリの命名の問題だとは思わないのです。私は分かりやすくするために私のポストにそれを示していませんでしたが、pkg-configからlibsを直接取得して以来、私は正しいものを使用していたと確信していました。私は "解決"のための私の元の質問にコメントを追加するつもりです.. – daroo