3

ブースト付きの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を定義する適切な方法は何ですか?

4

2 に答える 2

5

定数関連の問題のようです。試す:

int main( int argc, char* argv[] )
{
  // ...
}
于 2009-06-30T21:34:50.640 に答える
1

int main()およびint main(int argc, char* argv[])(aka int main(int argc, char** argv)) は、C++ 標準で承認された署名です。

VisualStudio は、(1) amain()または aが必要かどうかWinMain()、(2) chars またはwchar_ts が必要かどうかを判断するなど、さまざまな方法で役に立ちます。コンソール アプリケーションで作業していると VisualStudio が認識しない場合は、split_winmain() を呼び出す必要がある場合があります。

charsを強制したい場合(これをお勧めします)、 #undef UNICODE.

于 2009-06-30T21:39:45.950 に答える