Frage

Ich versuche, eine Cross-Plattform-Anwendung unter Verwendung von C ++ mit Boost zu entwickeln.

ich in der Regel Programm in einer * nix Umgebung, wo ich immer 'main' definiert haben, wie folgt:

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

Für diese Anwendung, ich bin in der Windows-Umgebung starten, Visual Studio 2003 verwenden.

Wenn ich versuche, mit dieser Definition boost :: program_options zu verwenden, erhalte ich Fehler aus program_options :: Speicher kompilieren:

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

Fehler:

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
    ]

Ich habe versucht, die Wchar_t Funktion zu zwingen, durch Definieren Haupt wie folgt:

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

Dann kompiliert, aber ich bekomme Linkfehler:

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

Schließlich, wenn ich von Visual Studio auf die Standard-Setup-Haupt Definition fallen zurück, es kompiliert und Links:

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

Also, das ist gut für Windows, aber diese Arbeit, wenn ich versuche, es zu nehmen auf * nichts? Sie diese Systeme typischerweise einen _TCHAR Typ definieren? Ich habe über sie persönlich nicht kommen.

Was ist der richtige Weg, Haupt definieren unter Windows und * nichts zu arbeiten, und der Arbeit mit der boost :: program_options Bibliothek?

War es hilfreich?

Lösung

Es scheint ein Konstantheit bezogenes Problem zu sein. Versuchen Sie:

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

Andere Tipps

int main() und int main(int argc, char* argv[]) (auch bekannt als int main(int argc, char** argv)) sind die C ++ Standards zugelassenen Signaturen.

versucht Visual Studio in einer Menge verrückter Weise nützlich zu sein, auch versuchen, wenn zu bestimmen (1) Sie ein main() oder ein WinMain() wollen und (2) die Entscheidung, ob Sie chars oder wchar_ts wollen. Wenn Sie Visual Studio nicht denken, in einer Konsole-Anwendung arbeiten, müssen Sie auf Anruf split_winmain () .

Wenn Sie wollen chars erzwingen (was ich empfehlen würde) Sie müssen möglicherweise #undef UNICODE .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top