jeudi 16 janvier 2020

Undefined symbols for architecture x86_64. Linker issue

I am trying to create a function in player.cpp that calls on a package that I downloaded. It evaluates equity for a poker hand. When I run my Makefile, I keep getting errors that various functions from classes in the package were not found. The package has already been built using the cmake file from the developer.

Here is player.cpp:

#include "player.hpp"

#include <boost/program_options.hpp>
#include <vector>
#include <random>

#include <boost/range/counting_range.hpp>
#include <boost/config.hpp>
#include <boost/range/irange.hpp>
#include <iostream>
#include <string>

#include <nit/eval/card_set.h>
#include <nit/eval/card.h>

namespace po = boost::program_options;

std::vector<nit::EquityResult> Player::calc_equity(std::string hand, std::string board)
{

    std::string game = "h";
    std::unique_ptr<nit::PokerHandEvaluator> evaluator = nit::makeEvaluator(game);
    std::vector<nit::CardDistribution> handDists;
    handDists.emplace_back();
    handDists.back().parse(hand);

    handDists.emplace_back();
    handDists.back().fill(evaluator->handSize());

    nit::ShowdownEnumerator showdown;
    std::vector<nit::EquityResult> results = showdown.calculateEquity(handDists, nit::CardSet(board), *evaluator);

    return results;

}

Here is the error message:

Undefined symbols for architecture x86_64:
  "nit::makeEvaluator(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)", referenced from:
      Player::calc_equity(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in player-3c5ae7.o
  "nit::CardDistribution::fill(int)", referenced from:
      Player::calc_equity(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in player-3c5ae7.o
  "nit::CardDistribution::CardDistribution(nit::CardDistribution const&)", referenced from:
      void std::__1::allocator<nit::CardDistribution>::construct<nit::CardDistribution, nit::CardDistribution const&>(nit::CardDistribution*, nit::CardDistribution const&&&) in player-3c5ae7.o
  "nit::CardDistribution::CardDistribution()", referenced from:
      void std::__1::allocator<nit::CardDistribution>::construct<nit::CardDistribution>(nit::CardDistribution*) in player-3c5ae7.o
  "nit::ShowdownEnumerator::ShowdownEnumerator()", referenced from:
      Player::calc_equity(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in player-3c5ae7.o
  "nit::CardSet::CardSet(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)", referenced from:
      Player::calc_equity(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in player-3c5ae7.o
  "nit::ShowdownEnumerator::calculateEquity(std::__1::vector<nit::CardDistribution, std::__1::allocator<nit::CardDistribution> > const&, nit::CardSet const&, nit::PokerHandEvaluator const&) const", referenced from:
      Player::calc_equity(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in player-3c5ae7.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [makefile_bot:10: cppbot] Error 1

I don't think I'm failing to include the right files, or using the functions incorrectly, because when I try to purposely include the wrong files or put in wrong function arguments, it will produce a different error saying that the function wasn't found. I've set up my include directories correctly in my Makefile. I've tried compiling with both clang++ and g++ and don't understand what the issue could be here.

Aucun commentaire:

Enregistrer un commentaire