Hi;

  Problem: Undefined symbols for architecture arm64

  MacOS Sequoia (arm64). Ports are up-to-date.

  I was compiling a C example of a Rosetta Code task recently..

https://rosettacode.org/wiki/Vampire_number#C

Here's my clang error(s):
clang -lm -o ./vampire_number ./vampire_number.c
Undefined symbols for architecture arm64:
  "_dtally", referenced from:
      _fangs in vampire_number-2cd7e6.o
      _fangs in vampire_number-2cd7e6.o
      _fangs in vampire_number-2cd7e6.o
  "_max", referenced from:
      _fangs in vampire_number-2cd7e6.o
  "_min", referenced from:
      _fangs in vampire_number-2cd7e6.o
  "_ndigits", referenced from:
      _fangs in vampire_number-2cd7e6.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see
invocation)

Here's my gcc errors:
/opt/local/bin/gcc-mp-14 -lm-o ./vampire_number ./vampire_number.c
Undefined symbols for architecture arm64:
  "_dtally", referenced from:
      _fangs in ccjmm7mz.o
      _fangs in ccjmm7mz.o
      _fangs in ccjmm7mz.o
  "_max", referenced from:
      _fangs in ccjmm7mz.o
  "_min", referenced from:
      _fangs in ccjmm7mz.o
  "_ndigits", referenced from:
      _fangs in ccjmm7mz.o
ld: symbol(s) not found for architecture arm64
collect2: error: ld returned 1 exit status

Here's the source I was trying to compile:

#include <stdio.h>#include <stdlib.h>#include <stdint.h>#include <math.h>
typedef uint64_t xint;typedef unsigned long long ull;
xint tens[20];
inline xint max(xint a, xint b) { return a > b ? a : b; }inline xint
min(xint a, xint b) { return a < b ? a : b; }inline int ndigits(xint
x){     int n = 0;      while (x) n++, x /= 10; return n;}
inline xint dtally(xint x){     xint t = 0;     while (x) t += 1<<((x%10) * 6), 
x /= 10;
        return t;}
int fangs(xint x, xint *f){     int n = 0;      int nd = ndigits(x);    if (nd &
1) return 0;    nd /= 2;
        xint lo, hi;    lo = max(tens[nd-1], (x + tens[nd] - 2)/ (tens[nd] -
1));    hi = min(x / lo, sqrt(x));
        xint a, b, t = dtally(x);       for (a = lo; a <= hi; a++) {            
b = x /
a;              if (a * b == x && ((a%10) || (b%10)) && t == dtally(a) +
dtally(b))                      f[n++] = a;     }
        return n;}
void show_fangs(xint x, xint *f, xint cnt){     printf("%llu",
(ull)x);        int i;  for (i = 0; i < cnt; i++)               printf(" = %llu 
x %llu",
(ull)f[i], (ull)(x / f[i]));    putchar('\n');}
int main(void){ int i, j, n;    xint x, f[16], bigs[] =
{16758243290880ULL, 24959017348650ULL, 14593825548650ULL, 0};
        tens[0] = 1;    for (i = 1; i < 20; i++)                tens[i] = 
tens[i-1] * 10;
        for (x = 1, n = 0; n < 25; x++) {               if (!(j = fangs(x, f)))
continue;               printf("%2d: ", ++n);           show_fangs(x, f, j);    
}
        putchar('\n');  for (i = 0; bigs[i]; i++) {             if ((j = 
fangs(bigs[i],
f)))                    show_fangs(bigs[i], f, j);              else            
        printf("%llu is not
vampiric\n", (ull)bigs[i]);     }
        return 0;}

So, what am I missing?

What more information do you need to diagnose the problem?

Thanks,

Ken Wolcott

Reply via email to