Haven't tried but I'll guess that clang++ won't find the library unless you tell it to, adding options like
-L/opt/local/lib -lprimesieve Kind of surprised if it found primesieve.hpp without a -I/opt/local/include (that was an upper case i, not a lower case L; hard to tell apart with the font I'm using) Now maybe your clang++ build has those paths built into it; but it surely would not know about the library without being told. > On Jul 28, 2025, at 18:55, Kenneth Wolcott <[email protected]> wrote: > > 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 >
