5

数日前にUbuntuをインストールし、apt-getを使用してbuild_essentials、opencv、highguiなどをインストールしました。g++は4.6.1、opencvは2.1.0のようです。ソースからopencvをビルドしませんでした。

opencv機能を使用するソフトウェアがいくつかあります。ソースファイルの名前がa.cppおよびb.cppであるとしましょう。aoとboにコンパイルしてから、それらを.soライブラリ(libab.soと呼びます)に入れます。

最後に、mainを含むファイルがあります(z.cppと呼びます)。そこから実行可能ファイルを作成しようとしましたが、cv::stuffに対して大量の「未定義の参照」エラーが発生します。私のリンクラインは次のようになります。

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

次に、未定義の参照エラーが発生します(これらはすべてcv ::のものです)。

興味深いのは、.oファイルと直接リンクすると、問題なくビルドされることです。したがって、この:

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

動作します。

私が読んだすべてのことは、これがリンク行の順序の問題である可能性が高いことを示唆しているようですが、すべての順序順列を試し、同じ問題が発生したため、実際には問題とは思われませんが、それでも間違っている可能性があります。ライブラリを使用してこれをビルドする方法や、ライブラリにある.oファイルの完全なセットを使用してビルドしても、ライブラリ自体を使用してビルドできない場合に、動作が異なる理由はありますか?

4

2 に答える 2

17

次のフラグを g++ に渡すことができます。

`pkg-config --libs opencv`

例えば:

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

pkg-config は、ライブラリに関する情報をコンパイラに提供します。

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

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

このファイルには、コンパイルに関連するすべての情報が含まれています。

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}
于 2012-05-02T19:46:27.137 に答える
3

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

私は通常、最初にコア モジュールにリンクします。順序が重要であるためです。次に、アルファベット順に従います (モジュールを忘れないようにするため)。

- 編集 -

opencv libs の後に -lab を配置しようとしましたか? ライブラリはコマンドラインの順序でリンクされているため、これでうまくいくかもしれません。

于 2012-05-02T14:34:59.573 に答える