O que é 'main' Definição do Seleccionados Cross-plataforma Usando boost :: program_options?
-
21-08-2019 - |
Pergunta
Eu estou tentando desenvolver uma aplicação multi-plataforma usando C ++ com impulso.
Eu normalmente programa em um ambiente * nix, onde eu sempre definido 'principal' da seguinte forma:
int main( const int argc, const char* argv[] )
{
...
}
Para esta aplicação, eu estou começando no ambiente do Windows, utilizando o Visual Studio 2003.
Quando tento usar boost :: program_options com esta definição, eu recebo erros de compilação de program_options :: loja:
po::options_description desc("Supported options");
desc.add_options()...;
po::variables_map vm;
po::store(po::parse_command_line(argc, argv, desc), vm);
Erro:
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
]
Eu tentei forçar a função wchar_t definindo principal da seguinte forma:
int main( const int argc, wchar_t* argv[]){
...
}
Em seguida, ele compila, mas recebo erros de link:
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 &)"
Finalmente, se eu cair de volta para a configuração definição principal padrão, Visual Studio, ele compila e links:
int main( const int argc, _TCHAR* argv[]){
...
}
Então, isso é bom para Windows, mas este trabalho quando eu tento levá-la para * nix? Não esses sistemas normalmente definir um tipo _TCHAR? Eu não encontrei pessoalmente.
O que é a maneira correta para definir principal para trabalhar em Windows e * nix, mais trabalho com a biblioteca boost :: program_options?
Solução
Parece ser um problema relacionado constness. Tente:
int main( int argc, char* argv[] )
{
// ...
}
Outras dicas
int main()
e int main(int argc, char* argv[])
(int main(int argc, char** argv)
a.k.a.) são as assinaturas C ++ Padrões aprovados.
VisualStudio tenta ser útil em muitas maneiras loucas, incluindo a tentar determinar se (1) você quer um main()
ou um WinMain()
e (2) decidir se você quer char
s ou wchar_t
s. Se VisualStudio não acha que você está trabalhando em um aplicativo de console, você pode precisar de chamada split_winmain () .
Se você quiser char
s força (que eu recomendaria) pode ser necessário #undef UNICODE
.