本当は怖いHPC

HPC屋の趣味&実益ブログ

古いBoostだとNVCCでコンパイルできない

訂正:最新のBoost(1.47)でも治ってませんでした.まぁどちらかというとNVCCのバグなんですが・・・

Ubuntuの10.04LTS上でCUDAプログラムにBoostライブラリを導入しようとしたらハマっりました。

/usr/include/boost/lexical_cast.hpp(347): error: expected an expression

該当ファイルではBoostの機能は使っていないため、かなり混乱。結論としてはNVCCのプリプロセッサがBoostをぶっ壊しているらしい:

https://svn.boost.org/trac/boost/ticket/5631

バグは(Boost側で)Boostバージョン1.42において修正されたのだが,Ubuntu10.04に入っているBoostは1.40なのでした。

最新版を$HOMEに入れるとかしか解決策がなさそう。最新版でもFixされていないので、Boostをローカルに入れた上で手動で書き換える必要があります.
具体的には、

 std::numeric_limits<Source>::is_specialized + // == 1

となっている行のコメントを Cスタイルのコメント /* 〜 */にする必要があります.NVCCは、マクロの中のC++スタイルコメントを正しく展開できません。


ちなみに、CMakeを使っている場合は、FindBoostモジュールを使った上で、

find_package(Boost 1.42 COMPONENTS program_options filesystem REQUIRED)
if(Boost_FOUND)
  include_directories(${Boost_INCLUDE_DIR})
  target_link_libraries(yourprog ${Boost_LIBRARIES})
endif()

などとすればOK.だけどちょっと面倒。

$ mkdir build && cd build
$ cmake -D BOOST_ROOT=$YOUR_LOCAL_BOOST_DIR ..

追記:こちらにも言及がありまいした http://d.hatena.ne.jp/aont/20110504/1304498046

【広告】