interprete mal a parte do cmake em incluir a biblioteca

1

Eu tenho tentado incluir esta biblioteca de pokerstove para que eu pudesse incluir esses arquivos de cabeçalho em meu programa simples para que eu pudesse calcular algumas ações de mão de poker. Até agora não está indo muito bem, provavelmente porque eu estou enfrentando esta cmake primeira vez na minha vida

Ok, então é isso que as instruções dizem

  

Para criar as bibliotecas, você precisará do seguinte instalado   sua plataforma de escolha:

     
  • boost, versão 1.46 ou superior

  •   
  • cmake, versão 2.4 ou superior

  •   
  • subversão, versão 1.7 ou superior

  •   

Eu tenho isso e também tenho o git e o compilador GNU C ++

Em seguida, devo fazer isso:

git clone https://github.com/andrewprock/pokerstove.git
mkdir pokerstove/src/build
cd pokerstove/src/build
cmake ..
make

e do que eu seria capaz de executar esta linha de comando

  

girts @ girts-ThinkPad-E520: ~ / pokerstove / src / compilação $ bin / ps-eval

E sim, tnx para este fórum "I" (claro que não era realmente) realmente fez funcionar. Aqui estão minhas perguntas anteriores:

pergunta 1

pergunta 2

Ainda consegui compilar o arquivo .cpp com esse código

#include <iostream>
#include <vector>
#include <boost/algorithm/string.hpp>
#include <boost/math/special_functions/binomial.hpp>
#include <boost/foreach.hpp>
#include <boost/format.hpp>
#include <boost/lexical_cast.hpp>
#include <pokerstove/util/combinations.h>
#include <pokerstove/peval/Card.h>

int main(){

    std::cout << "Hello World!" << std::endl;
}

Mas isso, por outro lado, não funcionou

#include <iostream>
    #include <pokerstove/peval/CardSet.h>

    using pokerstove::CardSet;
    using pokerstove::Card;
    using pokerstove::Rank;
    using pokerstove::Suit;

    int main(void)
    {
        CardSet big_slick(Card(Rank('A'),Suit('s')),
                          Card(Rank('K'),Suit('s')));
        std::cout << big_slick.str() << std::endl;

        CardSet dead_mans_hand("AcAs8d8hJs");
        std::cout << dead_mans_hand.str() << std::endl;
    }

Além disso, por que precisamos mesmo executar o

cmake ..
make

comandos se

git clone https://github.com/andrewprock/pokerstove.git

já cria muitas pastas, incluindo aquelas em que todos os arquivos .cpp e .h estão dentro. Com o cmake e make, eu apenas crio alguns arquivos .run que são para algum tipo de teste e, se os executar, os testes mostram que tudo está funcionando de forma excelente, mas na realidade não posso dizer que tudo está funcionando. Também há mais do que apenas este arquivo CMakeLists.txt e instrução não diz o que fazer com eles

No geral, eu não entendo por que não há apenas arquivos normais .cpp e .h que você pode baixar e tudo funcionaria para todos (em qualquer sistema operacional). Por que, ao invés disso, existe essa grande solução de plataforma cruzada chamada cmake. Que bom está realmente fazendo aqui no meu problema? Eu estou sentindo falta de uma foto enorme aqui?

Obrigado por ler tudo isso!

EDIT: Em algumas ocasiões eu tenho que incluir

#include <gtest/gtest.h>

e, claro, compilador me diz que não existe tal diretório e isso é verdade. Mas essa cmake não deveria cuidar de todo esse projeto? É por isso que eu não entendo como é que é uma ótima ferramenta.

O grande exemplo que não é executado

#include <iostream>
#include <vector>
#include <string>
#include <boost/program_options.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/format.hpp>
#include <pokerstove/peval/PokerHandEvaluator.h>

using namespace std;
namespace po = boost::program_options;
using namespace pokerstove;

class EvalDriver
{
public:
    EvalDriver(const string& game, 
               const vector<string>& hands, 
               const string& board)
        : _peval(PokerHandEvaluator::alloc (game))
        , _hands(hands)
        , _board(board)
    {
    }

    void evaluate()
    {
        for (auto it=_hands.begin(); it!=_hands.end(); it++)
        {
            string& hand = *it;
            _results[hand] = _peval->evaluate(hand, _board);
        }
    }

    string str() const
    {
        string ret;
        for (auto it=_hands.begin(); it!=_hands.end(); it++)
        {
            const string& hand = *it;
            ret += boost::str(boost::format("%10s: %s\n") 
                              % hand 
                              % _results.at(hand).str());
        }
        return ret;
    }

private:
    boost::shared_ptr<PokerHandEvaluator> _peval;
    vector<string> _hands;
    string _board;
    map<string,PokerHandEvaluation> _results;
};

int main (int argc, char ** argv)
{
    string extendedHelp = "\n"
        "   For the --game option, one of the follwing games may be specified.\n"
        "     h     hold'em\n"
        "     o     omaha/8\n"
        "     O     omaha high\n"
        "     r     razz\n"
        "     s     stud\n"
        "     e     stud/8\n"
        "     q     stud high/low no qualifier\n"
        "     d     draw high\n"
        "     l     lowball (A-5)\n"
        "     k     Kansas City lowball (2-7)\n"
        "     b     badugi\n"
        "     3     three-card poker\n"
        "\n"
        "   examples:\n"
        "       ps-eval acas\n"
        "       ps-eval AcAs Kh4d --board 5c8s9h\n"
        "       ps-eval AcAs Kh4d --board 5c8s9h\n"
        "       ps-eval --game l 7c5c4c3c2c\n"
        "       ps-eval --game k 7c5c4c3c2c\n"
        "       ps-eval --game kansas-city-lowball 7c5c4c3c2c\n"
        "\n"
        ;

    try 
    {
        // set up the program options, handle the help case, and extract the values
        po::options_description desc("Allowed options");
        desc.add_options()
            ("help,?",    "produce help message")
            ("game,g",    po::value<string>()->default_value("h"), "game to use for evaluation")
            ("board,b",   po::value<string>()->default_value(""),  "community cards for he/o/o8")
            ("hand,h",    po::value< vector<string> >(),           "a hand for evaluation")
            ("quiet,q",   "produce no output")
            ;

        po::positional_options_description p;
        p.add("hand", -1);
        po::variables_map vm;
        po::store (po::command_line_parser(argc, argv)
                   .style(po::command_line_style::unix_style)
                   .options(desc)
                   .positional(p)
                   .run(), vm);
        po::notify (vm);

        // check for help
        if (vm.count("help") || argc == 1)
        {
            cout << desc << extendedHelp << endl;
            return 1;
        }

        // extract the options
        EvalDriver driver(vm["game"].as<string>(),
                          vm["hand"].as< vector<string> >(),
                          vm["board"].as<string>());
        driver.evaluate();
        if (vm.count("quiet") == 0)
            cout << driver.str();
    }
    catch(std::exception& e) 
    {
        cerr << "-- caught exception--\n" << e.what() << "\n";
        return 1;
    }
    catch(...) 
    {
        cerr << "Exception of unknown type!\n";
        return 1;
    }
    return 0;
}
    
por etrusks 27.04.2015 / 19:33

1 resposta

2

Não é de surpreender que existam dificuldades. Os autores não forneceram os scripts de instalação.

Portanto, temos que especificar os locais dos cabeçalhos e bibliotecas manualmente:

g++ -o programma ggg.cpp -I/home/girts/pokerstove/src/lib -l{peval,penum} -L/home/girts/pokerstove/src/build/lib/pokerstove/{peval,penum}

E há um erro no código do ggg.cpp, eu acho: CardSet não pode ser criado com duas cartas assim.

Exemplo que compila:

#include <iostream>
#include <pokerstove/peval/CardSet.h>
#include <pokerstove/peval/Card.h>

using pokerstove::CardSet;
using pokerstove::Card;
using pokerstove::Rank;
using pokerstove::Suit;

int main(void)
{
    CardSet big_slick(Card(Rank('A'),Suit('s')));
    std::cout << big_slick.str() << std::endl;

    CardSet dead_mans_hand("AcAs8d8hJs");
    std::cout << dead_mans_hand.str() << std::endl;
}
    
por Velkan 27.04.2015 / 20:39