みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

gcc使用時のエラー

現在openCVで画像処理プログラミングを行おうとしております。
一通りコーディングが終わった所でgccを使用してコンパイルをかけた所、
下記のようなエラーが出ました。
(コード中でhighgui.h及びcv.hをインクルードしています。)

/tmp/cch6hMvI.o: In function `cvDecRefData':
test.c:(.text+0xaa6): undefined reference to `cvFree_'
test.c:(.text+0xb2e): undefined reference to `cvFree_'

これはライブラリへのパスが通っていないものと思い、端末から
export LD_LIBRARY_PATH=/usr/local/lib/
としましたが、それでもエラーが出ます。さらに下記も試してみましたが同様です。
gcc -L/usr/local/lib -o test test.c
(/usr/local/lib/以下にlibopencv_core.so.2.4等が置いてあります。)

pkg-configを使用すればコンパイルは通るのですが、
何がどうなってエラーになっているのかイマイチ分からず気持ちが悪いです。

1、上記エラーは共有ライブラリへのパスが通っていないために起きているものですか?
2、そうだとすれば、-Lやexport LD_LIBRARY_PATHで解決出来ないのは何故でしょう?

上記だけで情報が不足している場合は提示致しますので、
どうぞよろしくお願い致します。

投稿日時 - 2012-09-11 00:45:36

QNo.7691564

すぐに回答ほしいです

質問者が選んだベストアンサー

>1、上記エラーは共有ライブラリへのパスが通っていないために起きているものですか?

違います。
openCV関係のライブラリをリンクするように指定していないからです。
-L はライブラリを探すパスを指定しているだけで、リンクするライブラリは -l で指定しないといけません。

また環境変数LD_LIBRARY_PATHはプログラムの実行時のライブラリを探すパスを指定するものです。

pkg-configを使ってどういうコンパイルオプションやリンクオプションが指定されるのか確認されてみてはいかがでしょうか。

投稿日時 - 2012-09-11 01:11:49

補足

分かりやすい回答をありがとうございます。
しかし、自分が根本的に勘違いしている気がしてきました。

「-L はライブラリを探すパスを指定しているだけ」との事ですが、てっきり指定したパス(ディレクトリ)直下から、必要な共有ライブラリをgccが探してリンクしてくれるものと思っていました。
そうではなく、一つ一つ必要なライブラリを自分で指定してやる必要があるという事でしょうか?

また、もしそうだとすると-Lオプションの存在理由は、というか「ライブラリを探すパス」を指定する理由は何になるのでしょうか?

質問ばかりで恐縮ですが、ご助言頂ければ幸いです。
(なおpkg-configに関してですが、設定ファイルを見る限り/usr/local/lib以下にあるライブラリ(.so)を一つずつ指定しているように見えます。)

投稿日時 - 2012-09-11 01:44:55

お礼

度々すみません、上記誤解しておりました。
-Lでライブラリを検索するパスを追加した後、-lで実際のライブラリ名を指定するのですね。

また、グーグルで引っかかりましたが、
例えば「libopencv_calib3d.so」をリンクしたい場合、
先頭の"lib"と末尾の.so拡張子を取り除いた上で使用するとの事を初めて知りました。

"-lopencv_calib3d"のようにしましたら無事コンパイルが通りました。
ありがとうございます。

投稿日時 - 2012-09-11 02:05:18

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問