diary/Kojima

・CPLUS_INCLUDE_PATH

Plamo な環境では,KDE を入れると /etc/profile.d/qt.{sh,csh} で CPLUS_INCLUDE_PATH という環境変数を設定するのだけど,これが sh(bash)用 と csh(tcsh)用でちょっとだけ違っていたため,libsigc++-2.0.17 をコンパイ ルするのにハマってしまった.

具体的には qt.csh では CPLUS_INCLUDE_PATH の有無を調べてから追加するの で CPLUS_INCLUDE_PATH の中身は /usr/include/qt なんだけど,qt.sh では単 純に環境変数に追加しているから /usr/include/qt: になってしまう.

この環境変数の最後に : があると,g++ はインクルードファイルを探す際に /usr/include/qt だけではなく現在のディレクトリ(.)も探査対象にするみたい.

それが C++ の正しい動作なのかは確認してないのだけど,個人的にはバグっぽい
印象.でも GCC-4.2.1 でも同じ動作になるみたい.

そのため,/usr/include/signal.h を読み込まないといけないところで, libsigc++-2.0.17 が持っている自前の sigc++/signal.h というファイルを読 み込んでしまい,/usr/include/signal.h が提供する正しい定義が使えないで エラーになっていた模様.

こんな感じのエラーが大量に出力される
In file included from ../sigc++/functors/slot.h:8,
                 from ../sigc++/signal_base.h:28,
                 from ./signal.h:8,
                 from /usr/include/pthread.h:27,
                 from /usr/lib/gcc/i586-pc-linux/3.4.6/../../../../include/c++/3.4.6/i586-pc-linux/bits/gthr-default.h:43,
                 from /usr/lib/gcc/i586-pc-linux/3.4.6/../../../../include/c++/3.4.6/i586-pc-linux/bits/gthr.h:96,
                 from /usr/lib/gcc/i586-pc-linux/3.4.6/../../../../include/c++/3.4.6/i586-pc-linux/bits/c++io.h:37,
                 from /usr/lib/gcc/i586-pc-linux/3.4.6/../../../../include/c++/3.4.6/iosfwd:47,
                 from /usr/lib/gcc/i586-pc-linux/3.4.6/../../../../include/c++/3.4.6/bits/stl_algobase.h:70,
                 from /usr/lib/gcc/i586-pc-linux/3.4.6/../../../../include/c++/3.4.6/list:67,
                 from ../sigc++/trackable.h:21,
                 from ../sigc++/limit_reference.h:10,
                 from ../sigc++/functors/mem_fun.h:13,
                 from ../sigc++/adaptors/adaptor_trait.h:9,
                 from ../sigc++/adaptors/lambda/base.h:5,
                 from ../sigc++/adaptors/lambda/select.h:5,
                 from adaptors/lambda/lambda.cc:3:
../sigc++/functors/slot_base.h:54: error: expected class-name before '{' token
../sigc++/functors/slot_base.h:147: error: expected `,' or `...' before '*' token
../sigc++/functors/slot_base.h: In member function `void sigc::internal::slot_do_bind:
:operator()(int) const':

こういう風に書くと簡単に分ったように見えるけど,当初は g++ のインクルー ドファイルが壊れているのかと思って,何度もパッケージをバージョンを変え て再インストールしたり,ちゃんとコンパイルできる環境とヘッダーファイル を比較したりと悪戦苦闘.最終的には g++ に -E オプションを指定して,ちゃ んとコンパイルできる環境とプリプロセッサの出力を比較した結果,どうやら 読み込まれている signal.h が違うらしいことに気づき,なぜ違うヘッダーファ イルを読み込むのだろうと,あれこれ調べてようやく CPLUS_INCLUDE_PATH な んて環境変数があることに気づいた次第.結局,昨日一日,この現象を追いか けてしまった(苦笑



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2021-12-17 (金) 16:35:41