• ベストアンサー

make中に起こられた、tbbに関するエラーの対応方法が分からないでいます。

皆さん、こんにちは。 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 }

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

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.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)

c_iamok
質問者

お礼

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

その他の回答 (6)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.6

「どのようなコマンドでリンクしているか」を make が表示しているはずなので, それをあげてもらえますか? あと, (リンクしているライブラリが /usr/lib/libtbb.so だとして) nm /usr/lib/libtbb.so | c++filt | grep tbb::spin_rw_mutex_v3::internal_upgrade の結果はどうなっていますか?

c_iamok
質問者

お礼

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

  • php504
  • ベストアンサー率42% (926/2160)
回答No.5

あ、でも/usr/libは標準でパス通ってますよね /usr/libにlibtbb.soはありますか libtbb.so.2 とかじゃだめですよ

c_iamok
質問者

補足

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

  • php504
  • ベストアンサー率42% (926/2160)
回答No.4

ライブラリはincludeじゃなくてlibディレクトリです -L/usr/include/tbb/ ↓ -L/usr/lib

回答No.3

>Makefile内の中で、以下の行に記述がある状態ではあります。 tbbライブラリは「正しいライブラリパス」に置いてありますか? 「リンカやldやmakeが探してくれない場所」に置いてしまうと「無いのと一緒」ですから、makefileに何が書いてあっても意味がありません。

c_iamok
質問者

補足

親切な解説、大変感謝しております。 ありがとうございます。 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()'

回答No.2

>「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文字だけで、これだけの事が判るんですから、エラーメッセージは「穴があくほど良く見る」ようにしましょう。

  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

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

c_iamok
質問者

補足

アドバイスありがとうございます。 とてもありがたいです。 Makefile内の中で、以下の行に記述がある状態ではあります。 --------------------- LDFLAGS=-ltbb LIBS=-ltbb ---------------------

関連するQ&A