ما هو المفضل عبر منصة 'الرئيسية' تعريف باستخدام دفعة::program_options?

StackOverflow https://stackoverflow.com/questions/1066137

سؤال

أنا أحاول أن تتطور عبر منصة التطبيق باستخدام C++ مع زيادة.

أنا عادة البرنامج في *nix البيئة ، حيث لطالما تعريف 'الرئيسية' على النحو التالي:

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

لهذا التطبيق ، أنا بدأت في بيئة ويندوز باستخدام 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[]){
...
}

حتى أن ويندوز, ولكن هذا العمل عندما أحاول أن تأخذه إلى *nix ؟ هل هذه النظم عادة تحديد _TCHAR النوع ؟ أنا لم تأتي عبر ذلك شخصيا.

ما هي الطريقة المناسبة لتحديد الرئيسية للعمل على ويندوز *nix, بالإضافة إلى العمل مع دفعة::program_options المكتبة ؟

هل كانت مفيدة؟

المحلول

ويبدو أن مشكلة تتعلق constness. جرب:

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

نصائح أخرى

int main() و int main(int argc, char* argv[]) (أ.ك.أ. int main(int argc, char** argv)) هي C++ المعايير المعتمدة من التوقيعات.

VisualStudio يحاول أن يكون مفيدا في الكثير من الجنون الطرق ، بما في ذلك في محاولة لتحديد ما إذا كان (1) هل تريد main() أو WinMain() و (2) تحديد ما إذا كنت تريد chars أو wchar_ts.إذا VisualStudio لا أعتقد أنك تعمل في تطبيق وحدة تحكم ، قد تحتاج إلى دعوة split_winmain().

إذا كنت ترغب في القوة chars (أوصي) قد تحتاج إلى #undef UNICODE.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top