我一直在尝试这个 pokerstove 图书馆所以我实际上可以在我的简单程序中包含这些头文件,这样我就可以计算一些扑克牌手的权益。到目前为止,一切进展不顺利,可能是因为这是我一生中第一次遇到这个 cmake
好的,说明书上是这么说的
为了构建库,您需要在您选择的平台上安装以下内容:
boost,版本 1.46 或更高版本
cmake,版本 2.4 或更高版本
subversion,版本 1.7 或更高版本
我得到了它,还得到了 git 和 GNU C++ 编译器
接下来我应该这样做:
git clone https://github.com/andrewprock/pokerstove.git
mkdir pokerstove/src/build
cd pokerstove/src/build
cmake ..
make
然后我就可以执行这个命令行
girts@girts-ThinkPad-E520:~/pokerstove/src/build$ bin/ps-eval
是的,感谢这个论坛“我”(当然那不是我)确实让它工作了。以下是我之前的问题:
我仍然能够用此代码编译 .cpp 文件
#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;
}
但另一方面,这并没有奏效
#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;
}
为什么我们实际上必须执行
cmake ..
make
命令如果
git clone https://github.com/andrewprock/pokerstove.git
已经创建了很多文件夹,包括所有 .cpp 和 .h 文件所在的文件夹。使用 cmake 和 make,我只创建了一些用于某种测试的 .run 文件,如果我运行它们,测试表明一切都运行良好,但实际上我不能说一切都正常。此外,还有不止一个CMakeLists.txt
文件,说明没有说明如何处理它们
总的来说,我不明白为什么不能有普通的 .cpp 和 .h 文件供下载,这样每个人都可以使用(在任何操作系统上)。为什么会有这个名为 cmake 的出色跨平台解决方案。它在我的问题中到底有什么用?我这里漏掉了一些大图吗?
感谢您阅读完这一切!
编辑:在某些情况下我必须包括
#include <gtest/gtest.h>
当然,编译器告诉我没有这样的目录,这是真的。但 cmake 不是应该负责整个项目吗?这就是为什么我不明白它怎么会是一个如此出色的工具。
无法运行的大示例
#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;
}
答案1
有困难并不奇怪。作者没有提供安装脚本。
因此,我们必须手动指定头和库位置:
g++ -o programma ggg.cpp -I/home/girts/pokerstove/src/lib -l{peval,penum} -L/home/girts/pokerstove/src/build/lib/pokerstove/{peval,penum}
并且我认为 ggg.cpp 的代码中有一个错误:无法用两张这样的卡片创建 CardSet。
编译示例:
#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;
}