2016-11-08 177 views
1

我有一个问题。我正在使用Cmake并使用VS 2015进行提升。Cmake,Boost解析命令行

我打算开发一个使用cgal和assimp的工具。将文件格式转换为我自己的。但是,我遇到了一个问题,可能很简单,但无法看到它。

当我按下F5时,出现调试错误,如我附加的两个图像。我也附上我的代码。这些照片是在这里:

enter image description here

enter image description here

#include <boost/asio.hpp> 
#include <boost/filesystem/path.hpp> 
#include <boost/iostreams/device/file_descriptor.hpp> 
#include <boost/iostreams/stream.hpp> 
#include <boost/program_options.hpp> 
#include <boost/system/error_code.hpp> 
#include <iostream> 
#include <sstream> 
#include <string> 

struct CMDOPTIONS { 
    std::string input, output, directory; 
    int points; 
}; 

namespace po = boost::program_options; 

bool process_command_line(int argc, char **argv, CMDOPTIONS &cmdoptions1) { 

    if (argv == nullptr) { 
     return false; 
    } 

    try { 
     po::options_description desc("Program Usage"); 
     po::options_description desc ("Program Usage"); 
     desc.add_options() 
      ("halp, h", "Halp!") 
      ("input, i", po::value<std::string>(&cmdoptions1.input), "Specify Input") 
      ("output, o", po::value<std::string>(&cmdoptions1.output) ,"Specify Output") 
      ("points, p", po::value<int>(&cmdoptions1.points), "% of reduced points") 
      ("directory, d", po::value<std::string>(&cmdoptions1.directory)->required(), "set the directory"); 

     po::variables_map vm; 
     po::store(po::parse_command_line(argc, argv, desc), vm); 
     po::notify(vm); 

     if (vm.count("help")) { 
      std::cout << desc << std::endl; 
      return false; 
     } 

     // trolololol XD 
     if (vm.count("input")) { 
      &cmdoptions1.input; 
     } 

     if (vm.count("output")) { 
      &cmdoptions1.output; 
     } 

     if (vm.count("points")) { 
      &cmdoptions1.points; 
     } 

     if (vm.count("directory")) { 
      &cmdoptions1.directory; 
     } 

    } catch (std::exception &e) { 
     std::cerr << "Error: " << e.what() << std::endl; 
     return false; 
    } catch (int e) { 
     std::cerr << "Unknown error!" << e << std::endl; 
     return false; 
    } 

    return true; 
} 

int main(int argc, char **argv, CMDOPTIONS &cmdoptions1) { 

    bool result = process_command_line(argc, argv, cmdoptions1); 
    if (!result) 
     return -1; 

    std::cout << "input" << &cmdoptions1.input << std::endl; 
    std::cout << "output" << &cmdoptions1.output << std::endl; 
    std::cout << "points" << &cmdoptions1.points << std::endl; 
    std::cout << "directory\t" << &cmdoptions1.directory << std::endl; 
} 
+3

检查其中的断言起源。你登陆到调试器。用它! – sehe

+0

是的,我按下重试后,我显示它停在desc..add_options。不清楚为什么这是一个问题。 –

+1

好吧,你得到了你打破断点的窗口。只需使用中断按钮并进行调查。你正在使用boost程序选项错误.... visual studio应该指出你在哪里以及如何 – Hayt

回答

2

cmdoptions1未初始化。

实际上,您的main不应该编译(这是什么样的签名?)。

此外,您正在打印指向配置值的指针。

第三,当您键入trololol XD时,编译器没有得到您的意图。

Live On Coliru

#include <boost/asio.hpp> 
#include <boost/filesystem/path.hpp> 
#include <boost/iostreams/device/file_descriptor.hpp> 
#include <boost/iostreams/stream.hpp> 
#include <boost/program_options.hpp> 
#include <boost/system/error_code.hpp> 
#include <iostream> 
#include <sstream> 
#include <string> 

struct CMDOPTIONS { 
    std::string input, output, directory; 
    int points; 
}; 

namespace po = boost::program_options; 

bool process_command_line(int argc, char **argv, CMDOPTIONS &cmdoptions1) { 

    if (argv == nullptr) { 
     return false; 
    } 

    try { 
     po::options_description desc("Program Usage"); 
     desc.add_options() 
      ("halp, h", "Halp!") 
      ("input, i", po::value<std::string>(&cmdoptions1.input), "Specify Input") 
      ("output, o", po::value<std::string>(&cmdoptions1.output) ,"Specify Output") 
      ("points, p", po::value<int>(&cmdoptions1.points), "% of reduced points") 
      ("directory, d", po::value<std::string>(&cmdoptions1.directory)->required(), "set the directory"); 

     po::variables_map vm; 
     po::store(po::parse_command_line(argc, argv, desc), vm); 
     po::notify(vm); 

     if (vm.count("help")) { 
      std::cout << desc << std::endl; 
      return false; 
     } 

    } catch (std::exception &e) { 
     std::cerr << "Error: " << e.what() << std::endl; 
     return false; 
    } catch (int e) { 
     std::cerr << "Unknown error!" << e << std::endl; 
     return false; 
    } 

    return true; 
} 

int main(int argc, char **argv) { 

    CMDOPTIONS cmdoptions1; 
    bool result = process_command_line(argc, argv, cmdoptions1); 
    if (!result) 
     return -1; 

    std::cout << "input"  << cmdoptions1.input  << std::endl; 
    std::cout << "output"  << cmdoptions1.output << std::endl; 
    std::cout << "points"  << cmdoptions1.points << std::endl; 
    std::cout << "directory\t" << cmdoptions1.directory << std::endl; 
}