Home > OS >  Undefined symbols for architecture arm64 linking to fftw-3 with clang-14
Undefined symbols for architecture arm64 linking to fftw-3 with clang-14

Time:01-08

I'm trying to use the fftw-3 library in a C project on an M1 Mac (OS version Monterey). Both the fftw-3 lib and clang were installed via Macports.

Test code:

#include <fftw3.h>
int main() {
  fftwf_complex *fc = fftwf_alloc_complex(1);
  return 0;
}

Compiler call:

sudo /opt/local/bin/clang  -mp-14 -v -I/opt/local/include/ -L/opt/local/lib/ -lfftw3 -o /Users/ajw/test/test_exec /Users/ajw/test/main.cpp 

Linker error:

Undefined symbols for architecture arm64:
  "_fftwf_alloc_complex", referenced from:
      _main in main-cfb5fd.o

I understand that this error usually means the library isn't being found (there's a similar questions here: Undefine symbols for architecture x86_64 using FFTW), but I'm stumped as to why.

Here's the whole output:

clang version 14.0.6
Target: arm64-apple-darwin21.6.0
Thread model: posix
InstalledDir: /opt/local/libexec/llvm-14/bin
 "/opt/local/libexec/llvm-14/bin/clang" -cc1 -triple arm64-apple-macosx12.0.0 -Wundef-prefix=TARGET_OS_ -Werror=undef-prefix -Wdeprecated-objc-isa-usage -Werror=deprecated-objc-isa-usage -emit-obj -mrelax-all --mrelax-relocations -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name main.cpp -mrelocation-model pic -pic-level 2 -mframe-pointer=non-leaf -ffp-contract=on -fno-rounding-math -funwind-tables=2 -target-sdk-version=13.1 -fcompatibility-qualified-id-block-type-checking -fvisibility-inlines-hidden-static-local-var -target-cpu apple-m1 -target-feature  v8.5a -target-feature  fp-armv8 -target-feature  neon -target-feature  crc -target-feature  crypto -target-feature  dotprod -target-feature  fp16fml -target-feature  ras -target-feature  lse -target-feature  rdm -target-feature  rcpc -target-feature  zcm -target-feature  zcz -target-feature  fullfp16 -target-feature  sha2 -target-feature  aes -target-abi darwinpcs -fallow-half-arguments-and-returns -mllvm -treat-scalable-fixed-error-as-warning -debugger-tuning=lldb -target-linker-version 711 -v -fcoverage-compilation-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib -resource-dir /opt/local/libexec/llvm-14/lib/clang/14.0.6 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -I /opt/local/include/ -I/usr/local/include -stdlib=libc   -internal-isystem /opt/local/libexec/llvm-14/bin/../include/c  /v1 -internal-isystem /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/local/include -internal-isystem /opt/local/libexec/llvm-14/lib/clang/14.0.6/include -internal-externc-isystem /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include -fdeprecated-macro -fdebug-compilation-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib -ferror-limit 19 -stack-protector 1 -fblocks -fencode-extended-block-signature -fregister-global-dtors-with-atexit -fgnuc-version=4.2.1 -fcxx-exceptions -fexceptions -fmax-type-align=16 -fcolor-diagnostics -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /var/folders/zz/zyxvpxvq6csfxvn_n0000000000000/T/main-cfb5fd.o -x c   /Users/ajw/test/main.cpp
clang -cc1 version 14.0.6 based upon LLVM 14.0.6 default target arm64-apple-darwin21.6.0
ignoring nonexistent directory "/usr/local/include"
ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/local/include"
ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/Library/Frameworks"
#include "..." search starts here:
#include <...> search starts here:
 /opt/local/include
 /opt/local/libexec/llvm-14/bin/../include/c  /v1
 /opt/local/libexec/llvm-14/lib/clang/14.0.6/include
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks (framework directory)
End of search list.
 "/opt/local/libexec/llvm-14/bin/ld" -demangle -lto_library /opt/local/libexec/llvm-14/lib/libLTO.dylib -no_deduplicate -dynamic -arch arm64 -platform_version macos 12.0.0 13.1 -syslibroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -o /Users/ajw/test/test_exec -L/opt/local/lib/ -L/usr/local/lib -lfftw3 /var/folders/zz/zyxvpxvq6csfxvn_n0000000000000/T/main-cfb5fd.o -lc   -lSystem /opt/local/libexec/llvm-14/lib/clang/14.0.6/lib/darwin/libclang_rt.osx.a
Undefined symbols for architecture arm64:
  "_fftwf_alloc_complex", referenced from:
      _main in main-cfb5fd.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

I tried moving lib and header into default system paths, but no matter what paths I used (that I verified show up in the linker args), I still get the problem.

I wonder if the problem is the name-mangling macro in fftw3.h that looks like it prepends "fftw3f_" to function names like "alloc_complex".

CodePudding user response:

It looks like you’re getting confused between the single and double precision versions of the library (fftw3f v fftw3). Note that fftwf_alloc_complex is the single precision version of fftw_alloc_complex (and similarly for other FFT functions with fftw_/fftwf_ prefixes).

Change your command line link options from -lfftw3 to -lfftw3f in order to link the single precision (float) library. See the FFTW manual for further details.

  • Related