説明できないリンクの問題があります。このプログラムには、fft.cpp というファイルに FFTW 関数への参照が含まれています。リンク コマンドは次のとおりです (残りのオブジェクト ファイルはスキップしました)。
/usr/bin/g++ common/CleanerND.cpp.2.o ... common/fft.cpp.2.o
-o cleaner3d -Wl,-Bstatic -Wl,-Bdynamic -lmkl_intel_lp64 -lmkl_sequential -lmkl_core
-lfftw3f -lgsl -lgslcblas -lm -lglib-2.0 -lz -lm -lpthread -fopenmp
余分な -Wl,-Bstatic -Wl,-Bdynamic オプションは、ビルド システムとして使用する Waf によって生成されます。Ubuntu 12.04 に付属するデフォルトのツールチェーン (GCC 4.6.3、binutils 2.22) を使用します。
問題は、リンカが FFTW 関数への参照を検出および解決しないことです。実行すると、プログラムは次のメッセージで中止されます。
cleaner3d: symbol lookup error: cleaner3d: undefined symbol: fftwf_malloc
の出力ldd
は、FFTW がまったくリンクされていないことを示しています。
$ ldd cleaner3d
linux-vdso.so.1 => (0x00007fffa3193000)
libmkl_intel_lp64.so => /opt/intel/mkl/10.0.1.014/lib/em64t/libmkl_intel_lp64.so (0x00007f6f16683000)
libmkl_sequential.so => /opt/intel/mkl/10.0.1.014/lib/em64t/libmkl_sequential.so (0x00007f6f164d3000)
libmkl_core.so => /opt/intel/mkl/10.0.1.014/lib/em64t/libmkl_core.so (0x00007f6f16300000)
libgsl.so.0 => /usr/lib/libgsl.so.0 (0x00007f6f15ec4000)
libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007f6f15bcf000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f6f158d4000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f6f156b7000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f6f153b7000)
libgomp.so.1 => /usr/lib/x86_64-linux-gnu/libgomp.so.1 (0x00007f6f151a8000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f6f14f92000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6f14bd5000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f6f149d0000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f6f14793000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f6f1458b000)
/lib64/ld-linux-x86-64.so.2 (0x00007f6f169b2000)
nm
FFTW への参照が含まれていることがの出力に示されているため、これは明らかにリンカの障害です。
$ nm build/common/fft.cpp.2.o | grep fftw
U fftwf_destroy_plan
U fftwf_execute_dft
U fftwf_free
U fftwf_malloc
U fftwf_plan_dft_1d
U fftwf_plan_many_dft
--as-needed
これは、Ubuntu 12.04以降デフォルトで渡されるリンカーオプションに何らかの形で関連している可能性があることがわかりました-実際、-Wl,--no-as-needed
コマンドラインに追加すると、問題はなくなります。ただし、この回避策は必要ありません。--as-needed
リンカーがFFTWを有効にすると正しくリンクしない理由がわかりません。誰でもこれに光を当てることができますか?これはリンカーのバグですか?FFTW ライブラリだけが影響を受けるのはなぜですか?