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;
}