あなたの習慣について教えてください!!

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 は確認できました。

A 回答 (5件)

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

    • good
    • 0
この回答へのお礼

有難うございます。お教えいただいたようにオプションをつけたのですが以下のようなエラーがでてしまいました。まだ 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 (略

お礼日時:2007/04/11 23:08

実際に使用したコマンドも補足してください。


それから、念のためCygwinも最新の内容に更新してみてください。

この回答への補足

コマンド記入し忘れ、さらにお返事遅れてすみません。

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 がでました。

補足日時:2007/04/19 00:04
    • good
    • 0
この回答へのお礼

補足内での質問の件は無視してください・・・私の勘違いでした。
boost::regex_match を boost::regex_search とすればいいんですね・・ 

ご親切なご回答のおかげで無事動くようになりました。有難うございました!

お礼日時:2007/04/19 00:23

質問文のソースコードを実際にCygwinでコンパイルしてみましたが、エラーにはなりませんでした。



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

この回答への補足

ご親切に感謝いたします。以下バージョン情報です。

Boost: 1.33.1
gcc: 3.4.4
newlib: 1.14.0
binutils: binutils.lst.gz というのがあるだけでバージョン情報は分かりませんでした。これが問題なんでしょうか。

以上 cygwin の setup.exe でインストールしています。

補足日時:2007/04/15 00:44
    • good
    • 0

> /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 (略

肝心の部分を省略しないでください。
エラーメッセージは、どんなに長ったらしくても全文記載するのが基本です。

この回答への補足

マナーを知らず大変失礼いたしました。以下エラーメッセージです。

/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

補足日時:2007/04/13 06:35
    • good
    • 0

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

    • good
    • 0
この回答へのお礼

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

お礼日時:2007/04/11 22:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報