2009-06-30 8 views
3

Я пытаюсь разработать кросс-платформенное приложение с использованием C++ с boost.Что такое предпочтительное кросс-платформенное «основное» определение Использование boost :: program_options?

Я обычно программы в * NIX среде, где я всегда определен «главный» следующим образом:

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

Для этого приложения, я начинаю в среде Windows, с помощью Visual Studio 2003.

Когда я пытаюсь использовать повышение :: program_options с этим определением, я получаю ошибку компиляции 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); 

ошибки:

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 
    ] 

Я пытался заставить функцию wchar_t, определив основные следующим образом:

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

Затем он компилируется, но я получаю ошибки ссылки:

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

Наконец, если я падаю назад к стандартной настройке основного определения Visual Studio, она компилируется и содержит ссылки:

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

Итак, это хорошо для Windows, но будет ли это работать, когда я попытаюсь взять его в * nix? Обычно эти системы определяют тип _TCHAR? Я не сталкивался с этим лично.

Каков наилучший способ определить основное для работы с Windows и * nix, а также работать с библиотекой boost :: program_options?

ответ

5

Кажется, что проблема связана с постоянством. Попробуйте:

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

Спасибо, что сработало. На этой заметке - может кто-нибудь объяснить мне, почему argc и argv не должны быть const в основном? –

+2

Потому что это говорит стандарт C++. Обратите внимание, что все примеры библиотек также используют соответствующую подпись. –

+0

Думаю, я должен был спросить: «Почему стандарт не определяет их как const?». Мне кажется, что эти вещи не должны меняться в контексте «основного». –

1

int main() и int main(int argc, char* argv[]) (а.к.а. int main(int argc, char** argv)) являются C++ стандарты, одобренные подписи.

VisualStudio пытается быть полезным во многих сумасшедших способов, в том числе пытаясь определить, если (1) вы хотите main() или WinMain() и (2) принимать решение, если вы хотите char с или wchar_t с. Если VisualStudio не считает, что вы работаете в консольном приложении, вам может потребоваться call split_winmain().

Если вы хотите заставить char s (что я бы рекомендовал), вам может понадобиться #undef UNICODE.