Hi;

Unable to compile a C++ program from Rosetta Code that uses Primesieve

https://rosettacode.org/wiki/Anaprimes

port installed | grep primesieve
  primesieve @12.4_0 (active)

Am I missing something critical like an environment variable that
specifies /opt/local/lib, or something like that?

Do I need a link command with my clang++ command?

clang++ -o ./anaprimes ./anaprimes.cpp

Undefined symbols for architecture arm64:
  "primesieve::iterator::generate_next_primes()", referenced from:
      primesieve::iterator::next_prime() in anaprimes-0a28a6.o
  "primesieve::iterator::iterator()", referenced from:
      _main in anaprimes-0a28a6.o
  "primesieve::iterator::~iterator()", referenced from:
      _main in anaprimes-0a28a6.o
      _main in anaprimes-0a28a6.o
ld: symbol(s) not found for architecture arm64
clang++: error: linker command failed with exit code 1 (use -v to see
invocation)

cat -n ./anaprimes.cpp
     1 #include <array>
     2 #include <iostream>
     3 #include <map>
     4 #include <vector>
     5
     6 #include <primesieve.hpp>
     7
     8 using digit_set = std::array<int, 10>;
     9
    10 digit_set get_digits(uint64_t n) {
    11    digit_set result = {};
    12    for (; n > 0; n /= 10)
    13        ++result[n % 10];
    14    return result;
    15 }
    16
    17 int main() {
    18    std::cout.imbue(std::locale(""));
    19    primesieve::iterator pi;
    20    using map_type =
    21        std::map<digit_set, std::vector<uint64_t>,
std::greater<digit_set>>;
    22    map_type anaprimes;
    23    for (uint64_t limit = 1000; limit <= 10000000000;) {
    24        uint64_t prime = pi.next_prime();
    25        if (prime > limit) {
    26            size_t max_length = 0;
    27            std::vector<map_type::iterator> groups;
    28            for (auto i = anaprimes.begin(); i != anaprimes.end(); ++i) {
    29                if (i->second.size() > max_length) {
    30                    groups.clear();
    31                    max_length = i->second.size();
    32                }
    33                if (max_length == i->second.size())
    34                    groups.push_back(i);
    35            }
    36            std::cout << "Largest group(s) of anaprimes before " << limit
    37                      << ": " << max_length << " members:\n";
    38            for (auto i : groups) {
    39                std::cout << "  First: " << i->second.front()
    40                          << "  Last: " << i->second.back() << '\n';
    41            }
    42            std::cout << '\n';
    43            anaprimes.clear();
    44            limit *= 10;
    45        }
    46        anaprimes[get_digits(prime)].push_back(prime);
    47    }
    48 }

Thanks in advance for the help.

Ken Wolcott

Reply via email to