使用VS2013编译Boost

时间:2015-11-10 19:59:42

标签: boost visual-studio-2013

我试图在这里编译Boost Calc6示例:

http://www.boost.org/doc/libs/1_46_1/libs/spirit/example/qi/calc6/

通常情况下,使用Xcode在我的Mac上顺利完成。目前,我在使用VS2013的PC上。我在创建Win32控制台应用程序时为标准设置添加了一些内容。通常情况下,它会为您设置ProjectTitle.cpp和stdafx.cpp(它只有#include" stdafx.h"在里面)。

这是包含" main"的文件。在Calc示例中看起来像

RadioGroup[] answerGroup;
RadioButton[] answer;
Button finishButton;
RadioButton[] checkedRadioButton;
ArrayList<RadioButton> correctAnswerRadios;
ArrayList<RadioButton> wrongAnswersRadios;

    correctAnswerRadios = new ArrayList<>();
    wrongAnswersRadios = new ArrayList<>();
    answerGroup = new RadioGroup[5];
    answer = new RadioButton[4];

    int i = 0;
    for (Question qn : questions) {
        answerGroup[i] = new RadioGroup(this);
        int j = 0;
        for (Answer an : answers) {
            if (qn.getID() == an.getQuestion_id_answer()) {
                answer[j] = new RadioButton(this);
                answer[j].setText(an.getAnswer());
                answer[j].setId(j + 100);
                answer[j].setTag(String.valueOf(an.getCorrect_answer()));
                answerGroup[i].addView(answer[j]);

                answer[j].setOnClickListener(new View.OnClickListener() {
                    private boolean isChecked = true;
                    @Override
                    public void onClick(View v) {
                        for (int j = 0; j < answer.length; j++) {
                            checkedRadioButton[j] = ((RadioButton) v);
                            int CorrectAnswer = Integer.parseInt(checkedRadioButton[j].getTag().toString());
                            if (checkedRadioButton[j].isChecked() & CorrectAnswer == 1) {
                                correctAnswerRadios.add(checkedRadioButton[j]);
                            } else {
                                wrongAnswersRadios.add(checkedRadioButton[j]);
                            }
                        }
                    }
                });
                j++;
            }
        }
        linearLayout.addView(answerGroup[i]);
        i++;
    }

    finishButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            for (int i = 0; i < answerGroup.length; i++) {
                for (int j = 0; j < answer.length; j++) {
                    RadioButton correctRadio = correctAnswerRadios.get(j);
                    correctRadio.setTextColor(Color.GREEN);
                    RadioButton wrongRadio = wrongAnswersRadios.get(j);
                    wrongRadio.setTextColor(Color.RED);
                    answerGroup[i].getChildAt(j).setEnabled(false);
                }
            }
        }
    });

注意到我添加了

#include "calc6.hpp"
#include "stdafx.h" /* I ADDED THIS, AS IT COMES AS BOILERPLATE WITH VS PROJECT

template <typename Grammar>
bool compile(Grammar const& calc, std::string const& expr)

{
    using ascii::space;

    std::string::const_iterator iter = expr.begin();
    std::string::const_iterator end = expr.end();
    bool r = phrase_parse(iter, end, calc, space);

    if (r && iter == end)
    {
        std::cout << "-------------------------\n";
        std::cout << "Parsing succeeded\n";
        std::cout << "-------------------------\n";
        return true;
    }
    else
    {
        std::cout << "-------------------------\n";
        std::cout << "Parsing failed\n";
        std::cout << "-------------------------\n";
        return false;
    }
}

struct var_printer
{
    var_printer(std::vector<int> const& stack)
    : stack(stack)
    {
    }

    template <typename String, typename Data>
    void operator()(String const& s, Data const& data)
    {
        std::cout << "    " << s << ": " << stack[data] << std::endl;
    }

    std::vector<int> const& stack;
};

int
_tmain() // I CHANGED THIS FROM MAIN TO _TMAIN
{
    std::cout << "/////////////////////////////////////////////////////////\n\n";
    std::cout << "Expression parser...\n\n";
    std::cout << "/////////////////////////////////////////////////////////\n\n";
    std::cout << "Type some statements... ";
    std::cout << "Then type period ('.') to compile, run and print results\n\n";

    typedef std::string::const_iterator iterator_type;
    typedef statement<iterator_type> statement;

    vmachine mach;                  //  Our virtual machine
    std::vector<int> code;          //  Our VM code
    statement calc(code);           //  Our grammar

    std::string str;
    std::string program;
    while (std::getline(std::cin, str))
    {
        if (str.empty() || str[0] == '.')
            break;
        program += str;
    }

    if (::compile(calc, program))
    {
        mach.execute(code, calc.nvars);

        std::cout << "Results------------------\n\n";
        calc.vars.for_each(var_printer(mach.get_stack()));
        std::cout << "-------------------------\n\n";
    }

    std::cout << "Bye... :-) \n\n";
    return 0;
}

并将main更改为

#include "stdafx.h"

所有其他.cpp和.hpp文件完全按原样复制。在这一点上,我得到:(为错误的错误信息编辑道歉)

_tmain()

当我取消注释时

  Error 4   error LNK2019: unresolved external symbol "public: __thiscall
statement<class std::_String_const_iterator<class std::_String_val<struct
std::_Simple_types<char> > > >::statement<class
std::_String_const_iterator<class std::_String_val<struct
std::_Simple_types<char> > > >(class std::vector<int,class
std::allocator<int> > &)" 
(??0?$statement@V?$_String_const_iterator@V
$_String_val@U?$_Simple_types@D@std@@@std@@@std@@@@QAE@AAV?$vector@HV
$allocator@H@std@@@std@@@Z) 
referenced in function _wmain
c:\Users\housegroup\documents\visual studio2013\Projects\example\example\calc6.obj example
_tmain()中的

。否则,它至少在我注释时编译(例如,如果我将所有_tmain()留空。

请帮助,我几乎从不使用Visual Studio :(

1 个答案:

答案 0 :(得分:0)

删除所有头文件并将其重新添加到Header Files文件夹中。以前,我在Source Files文件夹中拥有它。