古い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