与--as-needed链接时,未解析对FFTW的引用

时间:2012-10-02 15:41:02

标签: g++ ld fftw binutils

我有一个无法解释的链接问题。该程序在名为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时,问题就消失了。但是,这种解决方法不是必需的。我不明白为什么链接器无法正确链接FFTW并启用--as-needed。任何人都可以对此有所启发吗?这是链接器错误吗?为什么只有FFTW库受到影响?

0 个答案:

没有答案