皆さん、こんにちは。
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 }
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)
php504さん!
どんぴしゃでした!
ありがとうございました!
「/usr/lib/libtbb.so」をコンパイルより除外したら、
見事に成功しました!
どうもありがとうございます!
No.5
- 回答日時:
あ、でも/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
--------------------------
No.3
- 回答日時:
>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()'
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文字だけで、これだけの事が判るんですから、エラーメッセージは「穴があくほど良く見る」ようにしましょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 英語 できるだけ直訳で英語の翻訳をお願いします。(英語→日本語) 1 2022/10/15 20:59
- その他(SNS・コミュニケーションサービス) 自分のpcがハッキングされたようなメールが来たのですがどうすればいいですか? 4 2022/10/02 16:14
- Excel(エクセル) なぜExit Subがあるのかわかりません 4 2023/02/19 12:34
- Visual Basic(VBA) 配列の勉強をしています。使用する変数の意味、検索条件の書き方が難しいです。 2 2022/09/15 14:06
- 英語 英文の添削をお願いします 4 2023/05/23 11:10
- 戦争・テロ・デモ ウクライナ、メル友に五千円要求されてさ 1 2022/04/02 09:38
- 英語 英語の質問です。 When I taught in high school, I wanted to 4 2023/08/19 16:10
- Visual Basic(VBA) 正規表現を用いての並び替え 7 2022/04/04 09:27
- 英語 この英文は平易な反面格調高いですか? 1 2023/01/15 12:04
- 英語 名詞構文 3 2022/12/08 22:45
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
スタティックライブラリ関係の...
-
スタティックリンクライブラリ...
-
猫でもわかるWindowsのスクリー...
-
VC++6.0からVC++.NET2005へ移植
-
syslog-ng make undefined
-
cygwinでOpenGLのコンパイルが...
-
ShellExecute関数について(初...
-
富士通のSoftune
-
#include <winreg.h>をインクル...
-
CD-レコの使い方を教えてください
-
fatal error LNK1104: ファイル...
-
「MFCを使用しない」から「MFC...
-
exeファイルはどのdllを参照す...
-
error LNK2001: 外部シンボル "...
-
python エラー
-
エクセルのエラーメッセージ「4...
-
<unistd.h>をVisualStudioでつ...
-
<math.h>があるのにsqrtが・...
-
VBAを何回も作り直して、容量が...
-
アプリケーションのDLLファイル...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
スタティックライブラリ関係の...
-
fatal error LNK1104: ファイル...
-
【VS2008 C++】2つのプロジェ...
-
C++Builder リンカエラーとは?
-
スタティックリンクライブラリ...
-
visual studio community2017 O...
-
静的/動的リンクライブラリにつ...
-
VC++6.0からVC++.NET2005へ移植
-
VC++でビルド時の、リンク警告 ...
-
error LNK2019: 未解決の外部シ...
-
#pragma commentの相対パス指定
-
dllかlibか
-
VS2010にて、依存関係とビルド順
-
'stdafx.h'のエラーに関して
-
WindowsにおけるPostgreSQL+C言...
-
eclipse+MinGWの環境で外部ライ...
-
'd3dx9.lib' が開けません。
-
lvwReport/エラー/プロジェクト...
-
#include <winreg.h>をインクル...
-
operator new が再定義されてい...
おすすめ情報