误解了 cmake 在包含库中的作用

误解了 cmake 在包含库中的作用

我一直在尝试这个 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

是的,感谢这个论坛“我”(当然那不是我)确实让它工作了。以下是我之前的问题:

问题 1

问题2

我仍然能够用此代码编译 .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;
}

相关内容