プロが教えるわが家の防犯対策術!

皆さん、こんにちは。
C++で書いたソースをmakeしているときに
自分では解決できなかった問題に出会いました。

内容としては
makeしているときに、
次に書かれているような「tbb」に関するエラーが出て、
コンパイルが進まないという件なのですが、
どうしたら問題点を解消できるのかが分からないでいます。

エラー内容は以下のとおりです。
-------------------------------------------------------
sim-main.o: In function `tbb::spin_rw_mutex_v3::scoped_lock::upgrade_to_writer()':
/usr/include/tbb/spin_rw_mutex.h:118: undefined reference to `tbb::spin_rw_mutex_v3::internal_upgrade()'
sim-main.o: In function `tbb::spin_rw_mutex_v3::scoped_lock::acquire(tbb::spin_rw_mutex_v3&, bool)':
/usr/include/tbb/spin_rw_mutex.h:108: undefined reference to `tbb::spin_rw_mutex_v3::internal_acquire_writer()'
/usr/include/tbb/spin_rw_mutex.h:109: undefined reference to `tbb::spin_rw_mutex_v3::internal_acquire_reader()'
-------------------------------------------------------

「tbb::spin_rw_mutex_v3」が参照できないよ!と
怒られているのは分かるのですが、

「spin_rw_mutex_v3」は、
同ファイル内の「spin_rw_mutex_v3」クラスで、
しっかり記述されているし、
この先、
どう自分が対応してあげればいいか?
分からないでいます。

何かアドバイスいただけると、
大変ありがたいです。
宜しくお願い致します。
開発環境はFedora9を利用しております。


42 class spin_rw_mutex_v3 {
    ・
    ・
    ・
72 public:
73 //! Construct unacquired mutex.
74 spin_rw_mutex_v3() : state(0) {}
75
76 #if TBB_DO_ASSERT
77 //! Destructor asserts if the mutex is acquired, i.e. state is zero.
78 ~spin_rw_mutex_v3() {
79 __TBB_ASSERT( !state, "destruction of an acquired mutex");
80 };
81 #endif /* TBB_DO_ASSERT */
82
83 //! The scoped locking pattern
84 /** It helps to avoid the common problem of forgetting to release lock.
85 It also nicely provides the "node" for queuing locks. */
86 class scoped_lock : private internal::no_copy {
87 public:
88 //! Construct lock that has not acquired a mutex.
89 /** Equivalent to zero-initialization of *this. */
90 scoped_lock() : mutex(NULL) {}
91
92 //! Acquire lock on given mutex.
93 /** Upon entry, *this should not be in the "have acquired a mutex" state. */
94 scoped_lock( spin_rw_mutex& m, bool write = true ) : mutex(NULL) {
95 acquire(m, write);
96 }
97
98 //! Release lock (if lock is held).
99 ~scoped_lock() {
100 if( mutex ) release();
101 }
102
103 //! Acquire lock on given mutex.
104 void acquire( spin_rw_mutex& m, bool write = true ) {
105 __TBB_ASSERT( !mutex, "holding mutex already" );
106 is_writer = write;
107 mutex = &m;
108 if( write ) mutex->internal_acquire_writer();
109 else mutex->internal_acquire_reader();
110 }
111
112 //! Upgrade reader to become a writer.
113 /** Returns true if the upgrade happened without re-acquiring the lock and false if opposite */
114 bool upgrade_to_writer() {
115 __TBB_ASSERT( mutex, "lock is not acquired" );
116 __TBB_ASSERT( !is_writer, "not a reader" );
117 is_writer = true;
118 return mutex->internal_upgrade();
119 }

A 回答 (7件)

g++ -DNDEBUG -O4 -D_PTHREADS -g -O0 -Wall -DDEBUG -L/usr/local/lib


この-L/usr/local/libで/usr/local/lib/libtbb.soをリンクしてそうですね
同じ名前ですがまったく別のライブラリかもしれません

http://sourceforge.net/projects/teambb
(TeamBlibbityBlabbity)
    • good
    • 0
この回答へのお礼

php504さん!

どんぴしゃでした!
ありがとうございました!

「/usr/lib/libtbb.so」をコンパイルより除外したら、
見事に成功しました!
どうもありがとうございます!

お礼日時:2009/04/09 16:49

「どのようなコマンドでリンクしているか」を make が表示しているはずなので, それをあげてもらえますか?


あと, (リンクしているライブラリが /usr/lib/libtbb.so だとして)
nm /usr/lib/libtbb.so | c++filt | grep tbb::spin_rw_mutex_v3::internal_upgrade
の結果はどうなっていますか?
    • good
    • 0
この回答へのお礼

適切な方策を検討するうえでの参考になりました。
アドバイスありがとうございました!

お礼日時:2009/04/09 16:53

あ、でも/usr/libは標準でパス通ってますよね


/usr/libにlibtbb.soはありますか
libtbb.so.2
とかじゃだめですよ

この回答への補足

ご説明ありがとうございました!
「libtbb.so」を探してみまたら、
こんな感じになっていました!
--------------------------
# find / -name libtbb.so
/lib/libtbb-0.2/.libs/libtbb.so
/usr/local/lib/libtbb.so
/usr/lib/libtbb.so
--------------------------

補足日時:2009/04/09 15:28
    • good
    • 0

ライブラリはincludeじゃなくてlibディレクトリです


-L/usr/include/tbb/

-L/usr/lib
    • good
    • 0

>Makefile内の中で、以下の行に記述がある状態ではあります。



tbbライブラリは「正しいライブラリパス」に置いてありますか?

「リンカやldやmakeが探してくれない場所」に置いてしまうと「無いのと一緒」ですから、makefileに何が書いてあっても意味がありません。

この回答への補足

親切な解説、大変感謝しております。
ありがとうございます。

Makefileの中で、
以下のように、
LIBSの部分で、
必要となるライブラリを指定してはいるのですが、

--------------------------------------------------
LIBS = -lpthread -lgmpxx -lcrypto -ltbb -L/usr/include/tbb/
--------------------------------------------------

やはり、同様のエラーが出てきてしまう状態ではあります。

tbbの位置を確認したところでは、
Makefileで指定したとおり、以下のディレクトリには、
あるみたいではあるようです。

#find / -name tbb
# cd /usr/include/tbb/

確かに、tbb下に、色々とtbbのファイルが存在はする。




g++ -DNDEBUG -O4 -D_PTHREADS -g -O0 -Wall -DDEBUG -L/usr/local/lib -o sim-main.o ../../ctl/lib/libctl.a -lpthread -lgmpxx -lcrypto -ltbb -L/usr/include/tbb/
sim-main.o: In function `tbb::spin_rw_mutex_v3::scoped_lock::upgrade_to_writer()':
/usr/include/tbb/spin_rw_mutex.h:118: undefined reference to `tbb::spin_rw_mutex_v3::internal_upgrade()'
sim-main.o: In function `tbb::spin_rw_mutex_v3::scoped_lock::acquire(tbb::spin_rw_mutex_v3&, bool)':
/usr/include/tbb/spin_rw_mutex.h:108: undefined reference to `tbb::spin_rw_mutex_v3::internal_acquire_writer()'
/usr/include/tbb/spin_rw_mutex.h:109: undefined reference to `tbb::spin_rw_mutex_v3::internal_acquire_reader()'

補足日時:2009/04/09 14:05
    • good
    • 0

>「tbb::spin_rw_mutex_v3」が参照できないよ!と


>怒られているのは分かるのですが、

違います。

sim-main.o: In function `tbb::spin_rw_mutex_v3::scoped_lock::upgrade_to_writer()':
/usr/include/tbb/spin_rw_mutex.h:118: undefined reference to `tbb::spin_rw_mutex_v3::internal_upgrade()'

「tbb::spin_rw_mutex_v3::scoped_lock::upgrade_to_writer()の中、ソースの118行目でtbb::spin_rw_mutex_v3::internal_upgrade()を呼んでいるが、tbbのspin_rw_mutex_v3にはinternal_upgrade()関数は存在せず、関数の実体が無いから呼び出せない」
って意味。

同様に
sim-main.o: In function `tbb::spin_rw_mutex_v3::scoped_lock::acquire(tbb::spin_rw_mutex_v3&, bool)':
/usr/include/tbb/spin_rw_mutex.h:108: undefined reference to `tbb::spin_rw_mutex_v3::internal_acquire_writer()'
/usr/include/tbb/spin_rw_mutex.h:109: undefined reference to `tbb::spin_rw_mutex_v3::internal_acquire_reader()'

「tbb::spin_rw_mutex_v3::scoped_lock::acquire(tbb::spin_rw_mutex_v3&, bool)の中、ソースの108行目、109行目でtbb::spin_rw_mutex_v3::internal_acquire_writer()とtbb::spin_rw_mutex_v3::internal_acquire_reader()を呼んでいるが、tbbのspin_rw_mutex_v3にはinternal_acquire_writer()とinternal_acquire_reader()の関数は存在せず、関数の実体が無いから呼び出せない」
って意味。

「リンク時に関数の実体が見付からない」って事だから、ヘッダとかでちゃんと定義はされてて、ライブラリを呼ぶ外部参照になっているので、コンパイルは通ってる。

で、コンパイル後のオブジェクトバイナリをリンクして実行ファイルを作成する際に、外部参照(ライブラリ呼び出し)されてる
internal_upgrade()
internal_acquire_writer()
internal_acquire_reader()
の関数の実体が無いって言ってエラーになっている。

「ヘッダには定義されてるけど、リンク時に関数の実体が見付からない」って事は「makefileのライブラリ指定で、必要なライブラリファイルを指定し忘れてる」って事。

makefileのリンクコマンドを再確認しましょう。

あと、エラーメッセージは「適当に斜め読み」しないで「何が書いてあるのか、じっくりちゃんと読む」ようにしましょう。

「sim-main.o:」って部分からだけでも「エラーはsim-main.cのコンパイル段階ではなく、sim-main.oをリンクして実行ファイル(a.out)を作る時に起きている」って事が判ります。

「.o」の2文字だけで、これだけの事が判るんですから、エラーメッセージは「穴があくほど良く見る」ようにしましょう。
    • good
    • 0

Makefileでtbbライブラリをリンクしてますか(-ltbbの記述がありますか)

この回答への補足

アドバイスありがとうございます。
とてもありがたいです。

Makefile内の中で、以下の行に記述がある状態ではあります。

---------------------
LDFLAGS=-ltbb
LIBS=-ltbb
---------------------

補足日時:2009/04/09 13:13
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!