2009-06-30 7 views
3

J'essaie de développer une application multiplateforme utilisant C++ avec boost.Quelle est la définition «principale» de la plateforme multiplate-forme préférée? Utilisation de boost :: options_programme?

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 
    ] 

J'ai essayé de forcer la fonction wchar_t en définissant principale 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 tombe en arrière à la définition de la définition principale par défaut par Visual Studio, il compile et relie:

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

Donc, c'est bon pour Windows, mais cela fonctionnera-t-il quand j'essayerai de l'emmener sur * nix? Est-ce que ces systèmes définissent généralement un type _TCHAR? Je ne l'ai pas rencontré personnellement.

Quelle est la bonne façon de définir main pour travailler sur Windows et * nix, plus travailler avec la bibliothèque boost :: program_options?

Répondre

5

Cela semble être un problème lié à la constance. Essayez:

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

Merci, cela a fonctionné. Sur cette note - quelqu'un peut-il m'expliquer pourquoi argc et argv ne devraient pas être const dans main? –

+2

Parce que c'est ce que disent les normes C++. Notez que tous les exemples de bibliothèque utilisent également la signature appropriée. –

+0

Je suppose que j'aurais dû demander "pourquoi le standard ne les définit-il pas comme const?". Il me semble que ces choses ne devraient pas changer dans le contexte de «principal». –

1

int main() et int main(int argc, char* argv[]) (int main(int argc, char** argv) a.k.a.) 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 main() ou un WinMain() et (2) de décider si vous voulez char s ou wchar_t s. Si VisualStudio ne pense pas que vous travaillez dans une application de console, vous devrez peut-être call split_winmain().

Si vous voulez forcer char s (que je recommanderais) vous devrez peut-être #undef UNICODE.