[openrtm-users 01078] Re: case sensitive file name in OpenRTM-aist svn

Yosuke Matsusaka yosuke.matsusaka @ aist.go.jp
2010年 1月 18日 (月) 14:40:46 JST


安藤さん

松坂です。

下記の件、対処法はまだわかっていないのですが、原因はわかりました。
以下の説明によると
http://gcc.gnu.org/onlinedocs/gcc/Template-Instantiation.html
g++のtemplateの自動的な実体化&配置は、ELFシステム or Windowsでのみ有効
という制限があるようです。
一番簡単な対処法は"-frepo"フラグを付けることのようですが、ライブラリの場合で
今回のように衝突が起こっている場合は手動で解決する必要があるようです。
-fno-implicit-templatesを使う方法も試してみたのですが、今度はexplicitに生成しなけ
ればならないオブジェクトが大量に出てしまいました。

マイナーなプラットフォームを使っているとこういう時に対処に困ります。
どうしたものやら、、、。

2010/1/14 Yosuke Matsusaka <yosuke.matsusaka @ aist.go.jp>:
> 安藤さん
>
> 松坂です。
>
> 2010/1/14 Ando Noriaki <n-ando @ aist.go.jp>:
>> これは、以下のgccのバグでしょうかね。
>> http://d.hatena.ne.jp/dollyva/20080115/p1
>> gccとglibcのバージョンはいくつでしょうか?
>>
>> いくつかのヘッダで、coil::GlobalFactory を実体化しています。
>> template class ::coil::GlobalFactory<RTC::InPortConsumer>;
>>
>> 普通は、weakシンボルとして定義されていて、リンカがよきに計らってくれる
>> ので、問題が出ないはずなのですが、いくつかのバージョンのgccでは
>> 怒られるみたいです。
>>
>> .oファイルをnmした結果はどうなってるでしょうか?
>
> $ nm Factory.o | grep Global
> 0000000000000270 T
> __ZN4coil13GlobalFactoryIN3RTC14InPortConsumerESsSt4lessISsEPFPS2_vEPFvRS5_EEC1Ev
> 0000000000000f10 S
> __ZN4coil13GlobalFactoryIN3RTC14InPortConsumerESsSt4lessISsEPFPS2_vEPFvRS5_EEC1Ev.eh
> 0000000000000020 T
> __ZN4coil13GlobalFactoryIN3RTC14InPortConsumerESsSt4lessISsEPFPS2_vEPFvRS5_EEC2Ev
> 0000000000000b38 S
> __ZN4coil13GlobalFactoryIN3RTC14InPortConsumerESsSt4lessISsEPFPS2_vEPFvRS5_EEC2Ev.eh
> 00000000000002c0 T
> __ZN4coil13GlobalFactoryIN3RTC14InPortConsumerESsSt4lessISsEPFPS2_vEPFvRS5_EED1Ev
> 0000000000000fc0 S
> __ZN4coil13GlobalFactoryIN3RTC14InPortConsumerESsSt4lessISsEPFPS2_vEPFvRS5_EED1Ev.eh
> 00000000000002a0 T
> __ZN4coil13GlobalFactoryIN3RTC14InPortConsumerESsSt4lessISsEPFPS2_vEPFvRS5_EED2Ev
> 0000000000000f88 S
> __ZN4coil13GlobalFactoryIN3RTC14InPortConsumerESsSt4lessISsEPFPS2_vEPFvRS5_EED2Ev.eh
> $ nm FactoryInit.o | grep Global
> 0000000000000110 T
> __ZN4coil13GlobalFactoryIN3RTC14InPortConsumerESsSt4lessISsEPFPS2_vEPFvRS5_EEC1Ev
> 00000000000005d8 S
> __ZN4coil13GlobalFactoryIN3RTC14InPortConsumerESsSt4lessISsEPFPS2_vEPFvRS5_EEC1Ev.eh
> 0000000000000000 T
> __ZN4coil13GlobalFactoryIN3RTC14InPortConsumerESsSt4lessISsEPFPS2_vEPFvRS5_EEC2Ev
> 00000000000003a0 S
> __ZN4coil13GlobalFactoryIN3RTC14InPortConsumerESsSt4lessISsEPFPS2_vEPFvRS5_EEC2Ev.eh
> 0000000000000140 T
> __ZN4coil13GlobalFactoryIN3RTC14InPortConsumerESsSt4lessISsEPFPS2_vEPFvRS5_EED1Ev
> 0000000000000610 S
> __ZN4coil13GlobalFactoryIN3RTC14InPortConsumerESsSt4lessISsEPFPS2_vEPFvRS5_EED1Ev.eh
> 00000000000000b0 T
> __ZN4coil13GlobalFactoryIN3RTC14InPortConsumerESsSt4lessISsEPFPS2_vEPFvRS5_EED2Ev
> 0000000000000568 S
> __ZN4coil13GlobalFactoryIN3RTC14InPortConsumerESsSt4lessISsEPFPS2_vEPFvRS5_EED2Ev.eh
>
> となっていました。安藤さんのご推察の通りTがずらずらと出てしまっていますね、、、。
>
> gccのバージョンについては、
>
> $ g++ -v
> Using built-in specs.
> Target: i686-apple-darwin10
> Configured with: /var/tmp/gcc/gcc-5646.1~2/src/configure
> --disable-checking --enable-werror --prefix=/usr --mandir=/share/man
> --enable-languages=c,objc,c++,obj-c++
> --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/
> --with-slibdir=/usr/lib --build=i686-apple-darwin10
> --with-gxx-include-dir=/include/c++/4.2.1
> --program-prefix=i686-apple-darwin10- --host=x86_64-apple-darwin10
> --target=i686-apple-darwin10
> Thread model: posix
> gcc version 4.2.1 (Apple Inc. build 5646) (dot 1)
>
> ということでアップル製のgccを使っていました(libcについては同じくアップル製のようでバージョンはわからず)。
>
> 今確認したところmacportsの中にGNU製のgcc(紹介いただいたURLにあるパッチが当たったものだと思います)
> があったのでそちらでコンパイルを試してみます。
>
> --
> Yosuke Matsusaka, Ph.D  <yosuke.matsusaka @ aist.go.jp>
>  Interaction Modeling Group /
>  National Institute of Advanced Industrial Science and Technology (AIST)
>  Tel: 029-862-6726  Web: http://staff.aist.go.jp/yosuke.matsusaka/
>



openrtm-users メーリングリストの案内