Quel est le préféré multiplate-forme « principale » Définition L'utilisation boost :: program_options?

StackOverflow https://stackoverflow.com/questions/1066137

Question

Je suis en train de développer une application multi-plateforme en C ++ avec boost.

En général, je programme dans un environnement * nix, où je me suis toujours défini le terme « principal » comme suit:

int main( const int argc, const char* argv[] )
{
...
}

Pour cette application, je commence dans l'environnement Windows, en utilisant Visual Studio 2003.

Lorsque je tente d'utiliser boost :: program_options avec cette définition, je reçois des erreurs de compilation du magasin de program_options:

po::options_description desc("Supported options");
desc.add_options()...;
po::variables_map vm;
po::store(po::parse_command_line(argc, argv, desc), vm);

Erreur:

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
    ]

I a essayé de forcer la fonction de wchar_t en définissant principal comme suit:

int main( const int argc, wchar_t* argv[]){
...
}

Ensuite, il compile, mais je reçois des erreurs de lien:

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 &)" 

Enfin, si je retombe à la principale configuration de définition par défaut par Visual Studio, il compile et liens:

int main( const int argc, _TCHAR* argv[]){
...
}

Alors, ce qui est bon pour Windows, mais ce travail lorsque je tente de le prendre à * nix? Est-ce que ces systèmes définissent généralement un type de _TCHAR? Je ne l'ai pas rencontré personnellement.

Quelle est la bonne façon de définir principale de travailler sous Windows et * nix, ainsi que le travail avec le boost :: bibliothèque program_options?

Était-ce utile?

La solution

Il semble être un problème lié à la constness. Essayez:

int main( int argc, char* argv[] )
{
  // ...
}

Autres conseils

int main() et int main(int argc, char* argv[]) (alias int main(int argc, char** argv)) sont les signatures des normes approuvées par C ++.

VisualStudio essaie d'être utile dans beaucoup de façons folles, y compris en essayant de déterminer si (1) vous voulez un ou main() et WinMain() (2) de décider si vous voulez ou s char wchar_t s. Si VisualStudio ne pense pas que vous travaillez dans une application de la console, vous devrez peut-être appel split_winmain () .

Si vous voulez forcer l #undef UNICODE (que je recommande), vous devrez peut-être <=>.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top