ブースト付きのC++を使用してクロスプラットフォームアプリケーションを開発しようとしています。
私は通常、*nix環境でプログラミングします。この環境では常に「main」を次のように定義しています。
int main( const int argc, const char* argv[] )
{
...
}
このアプリケーションでは、VisualStudio2003を使用してWindows環境から始めています。
この定義でboost::program_optionsを使用しようとすると、program_options::storeからコンパイルエラーが発生します。
po::options_description desc("Supported options");
desc.add_options()...;
po::variables_map vm;
po::store(po::parse_command_line(argc, argv, desc), vm);
エラー:
main.cpp(46) : error C2665: 'boost::program_options::store' : none of the 2 overloads can convert parameter 1 from type 'boost::program_options::basic_parsed_options<charT>'
with
[
charT=const char
]
c:\boost_1_38_0\boost\program_options\variables_map.hpp(34): could be 'void boost::program_options::store(const boost::program_options::basic_parsed_options<charT> &,boost::program_options::variables_map &,bool)'
with
[
charT=char
]
c:\boost_1_38_0\boost\program_options\variables_map.hpp(43): or 'void boost::program_options::store(const boost::program_options::basic_parsed_options<wchar_t> &,boost::program_options::variables_map &)'
while trying to match the argument list '(boost::program_options::basic_parsed_options<charT>, boost::program_options::variables_map)'
with
[
charT=const char
]
mainを次のように定義して、wchar_t関数を強制しようとしました。
int main( const int argc, wchar_t* argv[]){
...
}
次にコンパイルしますが、リンクエラーが発生します:
main.obj : error LNK2019: unresolved external symbol "void __cdecl boost::program_options::store(class boost::program_options::basic_parsed_options<unsigned short> const &,class boost::program_options::variables_map &)" referenced in function _main
main.obj : error LNK2019: unresolved external symbol "public: __thiscall boost::program_options::basic_parsed_options<unsigned short>::basic_parsed_options<unsigned short>(class boost::program_options::basic_parsed_options<char> const &)" referenced in function "public: class boost::program_options::basic_parsed_options<unsigned short> __thiscall boost::program_options::basic_command_line_parser<unsigned short>::run(void)"
main.obj : error LNK2019: unresolved external symbol "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl boost::program_options::to_internal(class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> > const &)" referenced in function "class std::vector<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > __cdecl boost::program_options::to_internal<class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> > >(class std::vector<class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> >,class std::allocator<class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> > > > const &)"
最後に、Visual Studioによるデフォルトのメイン定義設定にフォールバックすると、コンパイルされてリンクされます。
int main( const int argc, _TCHAR* argv[]){
...
}
だから、それはWindowsにとっては良いことですが、* nixに持って行こうとすると、これは機能しますか?これらのシステムは通常、_TCHARタイプを定義していますか?個人的には出会ったことがありません。
Windowsと*nixで動作し、さらにboost :: program_optionsライブラリで動作するようにmainを定義する適切な方法は何ですか?