Domanda

Sto cercando di sviluppare un'applicazione multipiattaforma in C ++ con boost.

Io di solito programma in un ambiente * nix, dove ho sempre definito 'main' nel seguente modo:

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

Per questa applicazione, sto iniziando in ambiente Windows, utilizzando Visual Studio 2003.

Quando provo ad usare boost :: program_options con questa definizione, ricevo errori di compilazione da program_options :: negozio:

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

Errore:

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
    ]

Ho provato a forzare la funzione wchar_t definendo principale come segue:

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

Poi si compila, ma ottengo errori di collegamento:

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

Infine, se cado di nuovo al difetto di impostazione principale definizione da Visual Studio, si compila e link:

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

Quindi, questo è un bene per Windows, ma sarà questo lavoro quando cerco di portarlo a * nix? Fare questi sistemi tipicamente definiscono un tipo _TCHAR? Non ho incontrato personalmente.

Qual è il modo corretto per definire principale per lavorare su Windows e * nix, oltre a lavorare con la libreria boost :: program_options?

È stato utile?

Soluzione

Sembra essere un problema legato costanza. Prova:

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

Altri suggerimenti

int main() e int main(int argc, char* argv[]) (pseudonimo int main(int argc, char** argv)) sono le firme C ++ approvati standard.

VisualStudio cerca di essere utile in molti modi, tra cui folli cercando di determinare se (1) si desidera una main() o un WinMain() e (2) decidere se si desidera char S o wchar_t S. Se VisualStudio non pensa che si sta lavorando in un'applicazione console, potrebbe essere necessario chiamata split_winmain () .

Se si vuole forzare #undef UNICODE s (che consiglio) potrebbe essere necessario <=> .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top