• ベストアンサー

Cygwin boost

Windows XP sp2 + Cygwin の C++ で正規表現を使いたく setup.exe で boost をインストールし、以下のコードをコンパイル($g++ regextest.cpp) したのですがエラーが出てしまいました。 コード: #include <boost/regex.hpp> #include <iostream> using namespace std; int main () { string str("Free Programming For Windows."); boost::regex reg("Free.+Windows\\."); if (boost::regex_match(str, reg)) { cout << "===> Matched." << endl; } else { cout << "===> Not matched." << endl; } return 0; } エラー: regextest.cpp:1:27: boost/regex.hpp: No such file or directory パスが通っていないようなのですが、どうしたらよいか分かりません。アドバイスいただけたら嬉しいです。 usr/include/boost-1_33_1 に boost/regex.hpp は確認できました。

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

正規表現を使うのであれば、インクルードパスの設定のほかに、-lboost_regex-gcc-mtまたは-lboost_regex-gcc-mt-sオプションを付けて、ライブラリをリンクしてやる必要があります。

SE-1
質問者

お礼

有難うございます。お教えいただいたようにオプションをつけたのですが以下のようなエラーがでてしまいました。まだ C++ を使い始めたばかりで明らかに基礎知識が不足しているので、良く勉強してから再挑戦したいと思います。今回はコンパイルオプションの勉強ができてよかったです。 /cygdrive/c/xxxx/Temp/ccjcOj70.o:regextest.cpp:(.text$_ZN5boost11basic_regexIcNS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEE6assignEPKcS7 _j[boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<ch (略

その他の回答 (4)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.5

実際に使用したコマンドも補足してください。 それから、念のためCygwinも最新の内容に更新してみてください。

SE-1
質問者

お礼

補足内での質問の件は無視してください・・・私の勘違いでした。 boost::regex_match を boost::regex_search とすればいいんですね・・  ご親切なご回答のおかげで無事動くようになりました。有難うございました!

SE-1
質問者

補足

コマンド記入し忘れ、さらにお返事遅れてすみません。 g++ -I "C:\cygwin\usr\include\boost-1_33_1" -lboost_regex-gcc-mt regextest.cpp コマンドは↑でした・・お恥ずかしいのですが、ライブラリはファイル名の後に指定することを知りませんでした。で、 g++ -I "C:\cygwin\usr\include\boost-1_33_1" regextest.cpp -lboost_regex-gcc-mt とするとコンパイルできました。でも実行すると出力が Not matched となってしまいました・・・今度は何がいけないんでしょうか・・・ boost::regex reg("Free"); を boost::regex reg(".+"); とすると Matched がでました。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

質問文のソースコードを実際にCygwinでコンパイルしてみましたが、エラーにはなりませんでした。 実際に使用したコマンド、それからBoost C++ Librariesのバージョン(Cygwinの場合はboost-1_33_1-1とか枝番があるはずです)、GCCとBinutilsとNewlibのバージョンを補足してください。 もし、GCCやBinutilsをご自身でソースからインストールした場合、バージョン(cygming specialかどうかも)以外に、configure時に指定したオプションも補足してください。

SE-1
質問者

補足

ご親切に感謝いたします。以下バージョン情報です。 Boost: 1.33.1 gcc: 3.4.4 newlib: 1.14.0 binutils: binutils.lst.gz というのがあるだけでバージョン情報は分かりませんでした。これが問題なんでしょうか。 以上 cygwin の setup.exe でインストールしています。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

> /cygdrive/c/xxxx/Temp/ccjcOj70.o:regextest.cpp:(.text$_ZN5boost11basic_regexIcNS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEE6assignEPKcS7 _j[boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<ch (略 肝心の部分を省略しないでください。 エラーメッセージは、どんなに長ったらしくても全文記載するのが基本です。

SE-1
質問者

補足

マナーを知らず大変失礼いたしました。以下エラーメッセージです。 /cygdrive/c/DOCUME~1/xxx/Temp/cc5KgyTU.o:regextest.cpp:(.text$_ZN5 boost9re_detail12perl_matcherIN9__gnu_cxx17__normal_iteratorIPKcSsEESaINS_9sub_m atchIS6_EEENS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEEC1ES6_S6_RNS_13match_r esultsIS6_S9_EERKNS_11basic_regexIcSD_EENS_15regex_constants12_match_flagsES6_[b oost::re_detail::perl_matcher<__gnu_cxx::__normal_iterator<char const*, std::bas ic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator <boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::basic_string<ch ar, std::char_traits<char>, std::allocator<char> > > > >, boost::regex_traits<ch ar, boost::cpp_regex_traits<char> > >::perl_matcher(__gnu_cxx::__normal_iterator <char const*, std::basic_string<char, std::char_traits<char>, std::allocator<cha r> > >, __gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::c har_traits<char>, std::allocator<char> > >, boost::match_results<__gnu_cxx::__no rmal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std:: allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterato r<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<ch ar> > > > > >&, boost::basic_regex<char, boost::regex_traits<char, boost::cpp_re gex_traits<char> > > const&, boost::regex_constants::_match_flags, __gnu_cxx::__ normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std ::allocator<char> > >)]+0x110): undefined reference to `boost::re_detail::perl_m atcher<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::ch ar_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu _cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<ch ar>, std::allocator<char> > > > >, boost::regex_traits<char, boost::cpp_regex_tr aits<char> > >::construct_init(boost::basic_regex<char, boost::regex_traits<char , boost::cpp_regex_traits<char> > > const&, boost::regex_constants::_match_flags )' collect2: ld returned 1 exit status

回答No.1

-I オプションでinclude-pathを指定するだけじゃないんですか?

SE-1
質問者

お礼

ご回答ありがとうございました。regex 等は#2さまご指摘のように別途 -l オプションが必要なようですが、他のライブラリは認識されうまくいきました。

関連するQ&A