話題(スレッド): once.h でmultiple definition

once.h でmultiple definition (2009-04-27 00:34, akira, #43446)

複数の.cppファイルでthread.hをincludeしているとmultiple definition の
リンクエラーになります。
/tmp/ccIiR5ho.o:(.data+0x0): multiple definition of `clx::detail::once_global_epoch'
/tmp/ccHB39Ej.o:(.data+0x0): first defined here


スマートな解決方法は無いでしょうか?
とりあえず#ifdefで初期化は特定のファイルだけにして他はexternにしましたが
まちがっているような気もするので正しいのかもお教えください。

#ifdef MAINFILE
  once_flag once_global_epoch = ULONG_MAX;
:       
#else
extern once_flag once_global_epoch;
:
#endif

メッセージ #43446 への返信×

ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする

RE: once.h でmultiple definition (2009-04-28 18:32, cielquis, #43516)

報告ありがとうございます.
取りあえずの対処法としては,上記で良いと思います.

修正法に関しては,現在検討中です.
修正版がリリースでき次第またこのスレッドに報告いたします.
それまでは,不便をおかけしますが上記の方法で対処をお願いいたします.
#43446 への返信

メッセージ #43516 への返信×

ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする

RE: once.h でmultiple definition (2009-06-01 16:01, cielquis, #44127)

version 0.15.0 にて対応しました.
何か不都合がありましたら,またよろしくお願いいたします.
#43516 への返信

メッセージ #44127 への返信×

ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする

RE: once.h でmultiple definition (2009-06-03 11:42, akira, #44160)

改修ありがとうございます。

ですが、
clx/unix/once.h:59: error: expected primary-expression before ‘{’ token
clx/unix/once.h:60: error: expected primary-expression before ‘{’ token
のエラーが出ます。
#44127 への返信

メッセージ #44160 への返信×

ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする

RE: once.h でmultiple definition (2009-06-03 12:05, cielquis, #44162)

報告ありがとうございます & ご不便おかけしています.
上記ですが,どの環境だとエラーが出るのかが分からないので,
申し訳ありませんが,コンパイル環境(OS とコンパイラのバージョン)
を教えて頂けないでしょうか.
#44160 への返信

メッセージ #44162 への返信×

ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする

RE: once.h でmultiple definition (2009-06-03 15:37, akira, #44172)

OSはLinux
ubuntu server v9.04

$ g++ example_thread.cpp
In file included from clx/thread.h:54,
from example_thread.cpp:36:
clx/unix/once.h: In constructor ‘clx::detail::global_condition::global_condition()’:
clx/unix/once.h:59: error: expected primary-expression before ‘{’ token
clx/unix/once.h:60: error: expected primary-expression before ‘{’ token

$ uname -a
Linux dev 2.6.28-11-server #42-Ubuntu SMP Fri Apr 17 02:48:10 UTC 2009 i686 GNU/Linux

$ gcc --version
gcc (Ubuntu 4.3.3-5ubuntu4) 4.3.3
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$
です。
#44162 への返信

メッセージ #44172 への返信×

ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする

RE: once.h でmultiple definition (2009-06-03 13:16, cielquis, #44169)

予想される範囲で,unix/once.h を修正してみました.
最新のソースコード (unix/once.h) は下記から取得できます.
http://svn.sourceforge.jp/view/trunk/unix/?root=clxcpp
よろしければ,試した結果を知らせて頂けると幸いです.
#44160 への返信

メッセージ #44169 への返信×

ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする

RE: once.h でmultiple definition (2009-06-03 15:50, akira, #44173)

お世話になっています。

http://svn.sourceforge.jp/view/trunk/unix/?root=clxcpp
このonce.hに入れ替えるとコンパイルエラーは起こらなくなりました
$ g++ example_thread.cpp -lpthread
$ ./a.out
AAAAA
AAAAAA
AAAAAAA
AAAAAAAA
AAAAAAAAA
AAAAAAAAAA
AAAAAAAAAAA
AAAAAAAAAAAA
AAAAAAAAAAAAA
AAAAAAAAAAAAAA
BBBBB
BBBBBB
BBBBBBB
BBBBBBBB
BBBBBBBBB
BBBBBBBBBB
BBBBBBBBBBB
BBBBBBBBBBBB
BBBBBBBBBBBBB
BBBBBBBBBBBBBB

end of main thread
$
#44169 への返信

メッセージ #44173 への返信×

ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする