See https://www.geeksforgeeks.org/inline-function-in-c/ for various
solutions.

Thanks.

On Fri, Mar 14, 2025 at 6:53 PM Kenneth Wolcott <kennethwolc...@gmail.com>
wrote:

> 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