[choreonoid-users-ja 00101] Re: プラグインを置くディレクトリについて

中岡 慎一郎 s.nakaoka @ aist.go.jp
2013年 6月 18日 (火) 13:32:15 JST


小島さん

産総研の中岡です。

Makefileによるサンプルのビルドにいろいろと不備があったようで申し訳ありま
せん。

まず、

> CXXFLAGS += `pkg-config --cflags eigen3`            (追加した行)
> CXXFLAGS += -I`echo $(HOME)`/src/choreonoid-1.3.1/src/Collision (追加した行)
> CXXFLAGS += -fPIC                       (追加した行)

についてですが、これでよろしいかと思います。

eigen3 については本来choreonoidのpkg-configで依存関係を記述しておくべき
なのですが、欠けていました。次期バージョンではこれを修正して、ユーザの
Makefileではeigen3の記述がなくてもよいようにします。

具体的には、misc/pkgconfig/choreonoid.pc.in の Requires: のところに
eigen3 >= 3.0.0 を追加します。

また、

> 致命的エラー: CollisionPairInserter.h: そのようなファイルやディレクトリはありません

については、単純にこのファイルが make install で入れるべきファイルのリス
トから抜けていたというミスでした。これも修正しておきます。

具体的には、src/Collision/CMakeLists.txt の

set(headers
 ...

のところに CollisionPairInserter.h を追加します。

fPICについては、環境によっては記述しなくても動くようなのですが、私の
Ubuntu 12.04 64bitの環境でもダメでした。これについても、入れるよう修正し
ておきます。

また、以上全てを適用しても、私の環境でも以下のエラーが出ることを確認しま
した。

> Cannot load library
> /usr/local/lib/choreonoid-1.3/libCnoidSample1Plugin.so:
> (/usr/local/lib/choreonoid-1.3/libCnoidSample1Plugin.so: undefined
> symbol: _ZTIN5cnoid8BodyItemE)

これについては良く分からなかったのですが、いろいろ試してみたところ、
Makefileで

$(PLUGIN): $(SRC)
	g++ -shared `pkg-config --libs choreonoid-body-plugin` -o $(PLUGIN) $(SRC)

となっているところで、-o 以降の記述とそれより前の依存ライブラリの記述を
入れ替えて、

$(PLUGIN): $(SRC)
	g++ -shared -o $(PLUGIN) $(SRC) `pkg-config --libs choreonoid-body-plugin`

のように書きます。(ライブラリの本体のオブジェクトファイルが前に来るよう
に記述します。)

するとlibCnoidBodyPlugin等とのリンクもちゃんと行われて、エラーなく実行で
きるようになりました。

どうも不思議なのですが、修正前の記述ですと、

ldd libCnoidSample1Plugin.so

とやっても、リンクされるべき依存ライブラリが出て来ません。つまり、リンク
がすっぽかされているようです。

修正後についてはlddで調べるとちゃんとリンクされていることが分かります。

どうもgccのバージョンによってはこの症状があるようです。
バグなのか仕様なのか分かりませんが、順番を変えるとリンクがされないという
のはトラブルのもとですので、なんとかしてほしい気がいたします。

というわけなのですが、不具合の報告ありがとうございました。


(06/16/13 21:28), k-kojima (imi) wrote:
> 中岡さん
> 
> 東京大学の小島です。
> ご返事ありがとうございます。
> 
> 諸事情によりプラグインのチェックアウト先をextplugin以下に置くのではなく、
> プラグインのディレクトリをchoreonoidとは関係のないところに置きたいので以下のやり方でやってみています。
>> プラグインのディレクトリをchoroenoidとは関係ない別のところに置きたい場合
>> については、以下のページを参照してください。
>> http://choreonoid.org/ja/plugin-development/hello-world-sample.html#choreonoid
> まず、試しにSample1Pluginでやってみたのですが、
> choreonoid起動時に下記のようなメッセージが出てプラグインが読み込めません。
> 
> どのように対処すればよいでしょうか。
> 
> ちなみに、ソースファイルはそのままですが、Sample1Plugin/ManualMakefileのままだと
> /usr/local/include/choreonoid-1.3/cnoid/src/Util/EigenTypes.h:8:22:
> 致命的エラー: Eigen/Core: そのようなファイルやディレクトリはありません
> /usr/local/include/choreonoid-1.3/cnoid/src/Collision/ColdetModelPair.h:10:35:
> 致命的エラー: CollisionPairInserter.h: そのようなファイルやディレクトリはありません
> /usr/bin/ld: Sample1Plugin.o: relocation R_X86_64_32 against `.bss'
> can not be used when making a shared object; recompile with -fPIC
> などのエラーが出てmakeが通らなかったので下記のように変更しました。
> 
> ********************************************************************************************************************************
> 【choreonoid起動時のメッセージ】
> プラグインファイル"/usr/local/lib/choreonoid-1.3/libCnoidBalancerPlugin.so"を読み込み中
> プラグインファイル"/usr/local/lib/choreonoid-1.3/libCnoidSample1Plugin.so"を読み込み中
> プラグインの読み込みが出来ませんでした。
> Cannot load library
> /usr/local/lib/choreonoid-1.3/libCnoidSample1Plugin.so:
> (/usr/local/lib/choreonoid-1.3/libCnoidSample1Plugin.so: undefined
> symbol: _ZTIN5cnoid8BodyItemE)
> プラグインファイル"/usr/local/lib/choreonoid-1.3/libCnoidHelloWorldPlugin.so"を読み込み中
> HelloWorldプラグインが読み込まれました。
> プラグインファイル"/usr/local/lib/choreonoid-1.3/libCnoidBodyPlugin.so"を読み込み中
> Bodyプラグインが読み込まれました。
> プラグインファイル"/usr/local/lib/choreonoid-1.3/libCnoidSimpleControllerPlugin.so"を読み込み中
> SimpleControllerプラグインが読み込まれました。
> プラグインファイル"/usr/local/lib/choreonoid-1.3/libCnoidPoseSeqPlugin.so"を読み込み中
> PoseSeqプラグインが読み込まれました。
> Balancerプラグインが読み込まれました。
> プラグインファイル"/usr/local/lib/choreonoid-1.3/libCnoidSample1Plugin.so"を読み込み中
> プラグインの読み込みが出来ませんでした。
> Cannot load library
> /usr/local/lib/choreonoid-1.3/libCnoidSample1Plugin.so:
> (/usr/local/lib/choreonoid-1.3/libCnoidSample1Plugin.so: undefined
> symbol: _ZTIN5cnoid8BodyItemE)
> プラグインファイル"/usr/local/lib/choreonoid-1.3/libCnoidSample1Plugin.so"を読み込み中
> プラグインの読み込みが出来ませんでした。
> Cannot load library
> /usr/local/lib/choreonoid-1.3/libCnoidSample1Plugin.so:
> (/usr/local/lib/choreonoid-1.3/libCnoidSample1Plugin.so: undefined
> symbol: _ZTIN5cnoid8BodyItemE)
> 
> *****************************************************************************************************************************
> 【変更後のMakefile】
> CXXFLAGS += `pkg-config --cflags choreonoid-body-plugin`
> CXXFLAGS += `pkg-config --cflags eigen3`            (追加した行)
> CXXFLAGS += -I`echo $(HOME)`/src/choreonoid-1.3.1/src/Collision (追加した行)
> CXXFLAGS += -fPIC                       (追加した行)
> 
> PLUGIN = libCnoidSample1Plugin.so
> SRC = Sample1Plugin.o
> 
> $(PLUGIN): $(SRC)
> g++ -shared `pkg-config --libs choreonoid-body-plugin` -o $(PLUGIN) $(SRC)
> 
> install: $(PLUGIN)
> install -s $(PLUGIN) `pkg-config --variable=plugindir choreonoid`
> clean:
> rm -f *.o *.so
> 
> 
> 2013年6月14日 17:44 中岡 慎一郎 <s.nakaoka @ aist.go.jp>:
>>
>> 小島さん
>>
>> 産総研の中岡です。
>>
>> まず、svn等でプラグインを別リポジトリで管理する場合も、そのリポジトリの
>> チェックアウト先をextplugin以下に置くことで、問題ない場合が多いです。
>> 私もそのようにしています。
>>
>> プラグインのディレクトリをchoroenoidとは関係ない別のところに置きたい場合
>> については、以下のページを参照してください。
>> http://choreonoid.org/ja/plugin-development/hello-world-sample.html#choreonoid
>>
>>
>> (06/14/13 15:36), k-kojima (imi) wrote:
>>> 東京大学の小島です
>>>
>>> 公式ホームページのプラグインの説明に
>>> 「まず、プラグイン用の追加のソースを置くディレクトリは、Choreonoidソースの”extplugin”ディレクトリとしています。
>>> 従って、まずこのディレクトリ以下に追加プラグイン用のサブディレクトリを作成し、そこにプラグインのソースやビルド設定を記述したCMakeLists.txtを格納するようにしてください。」
>>> とありますが、
>>> 開発するにあたって、svn等でプラグインソースを管理するため、プラグインのディレクトリをchoroenoidとは関係ない別のところに置きたい思います。
>>>
>>> プラグインの開発経験が浅く、一般的にどうするべきなのか分かりません。
>>> プラグインを開発している方々はどのように管理していらっしゃるのでしょうか。
>>> また、choreonoidのcmake等で設定すれば可能なのでしょうか。
>>>
>>> よろしくお願いいたします。
>>>
>>> --
>>> _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
>>> 東京大学 大学院
>>> 情報理工学系研究科 知能機械情報学専攻
>>> 小島 邦生 (KOJIMA KUNIO)
>>> k-kojima @ jsk.imi.i.u-tokyo.ac.jp
>>> Tel 03-5841-7416
>>> Fax 03-5841-6285
>>> 携帯 090-4501-5285
>>> _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
>>> _______________________________________________
>>> choreonoid-users-ja mailing list
>>> choreonoid-users-ja @ choreonoid.org
>>> https://choreonoid.org/mailman/listinfo/choreonoid-users-ja
>>>
>>
>>
>> --
>> 中岡 慎一郎 <s.nakaoka @ aist.go.jp>
>> 産業技術総合研究所 知能システム研究部門
>> ヒューマノイド研究グループ
>> Phone: 029-861-5161  Fax: 029-862-6519
>> _______________________________________________
>> choreonoid-users-ja mailing list
>> choreonoid-users-ja @ choreonoid.org
>> https://choreonoid.org/mailman/listinfo/choreonoid-users-ja
> 
> 
> 
> --
> _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
> 東京大学 大学院
> 情報理工学系研究科 知能機械情報学専攻
> 小島 邦生 (KOJIMA KUNIO)
> k-kojima @ jsk.imi.i.u-tokyo.ac.jp
> Tel 03-5841-7416
> Fax 03-5841-6285
> 携帯 090-4501-5285
> _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
> 

-- 
中岡 慎一郎 <s.nakaoka @ aist.go.jp>
産業技術総合研究所 知能システム研究部門
ヒューマノイド研究グループ
Phone: 029-861-5161  Fax: 029-862-6519


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