无法链接到fftw3库

问题描述 投票:0回答:3

我正在编译一个测试程序来测试fftw3(ver3.3.4)。由于它不是使用 root previlidge 安装的,所以我使用的命令是:

gcc -lm -L/home/my_name/opt/fftw-3.3.4/lib/ -I/home/my_name/opt/fftw-3.3.4/include/ fftwtest.c

库安装在哪里

/home/my_name/opt/fftw-3.3.4/

我的代码是fftw3网站上的第一个教程:

#include <stdio.h>
#include <fftw3.h>
int main(){
    int n = 10;
    fftw_complex *in, *out;
    fftw_plan p;

    in = (fftw_complex*) fftw_malloc(n*sizeof(fftw_complex));
    out = (fftw_complex*) fftw_malloc(n*sizeof(fftw_complex));
    p = fftw_plan_dft_1d(n, in, out, FFTW_FORWARD, FFTW_ESTIMATE);

    fftw_execute(p); /* repeat as needed */

    fftw_destroy_plan(p);

    fftw_free(in); fftw_free(out);

    return 0;
}

当我编译程序时,它返回以下错误:

/tmp/ccFsDL1n.o: In function `main':
fftwtest.c:(.text+0x1d): undefined reference to `fftw_malloc'
fftwtest.c:(.text+0x32): undefined reference to `fftw_malloc'
fftwtest.c:(.text+0x56): undefined reference to `fftw_plan_dft_1d'
fftwtest.c:(.text+0x66): undefined reference to `fftw_execute'
fftwtest.c:(.text+0x72): undefined reference to `fftw_destroy_plan'
fftwtest.c:(.text+0x7e): undefined reference to `fftw_free'
fftwtest.c:(.text+0x8a): undefined reference to `fftw_free'
collect2: ld returned 1 exit status

快速搜索意味着我没有正确链接到库,但有趣的是它并没有抱怨 fftw_plan 和 fftw_complex 的声明。事实上,如果我删除所有以“fftw_”开头的函数,只保留声明,它将通过编译。

那么我哪里做错了呢?链接正确吗?任何建议将不胜感激。

c linker linker-errors fftw
3个回答
13
投票

你已经通过

-L
告诉链接器在哪里可以找到库,但是你还没有告诉它要链接到哪个库。后者可以通过在行尾、在
-lfftw3
之前添加
-lm
来完成。

此外,

-L
标志需要列在
fftwtest.c
之后。


1
投票

您还需要添加链接到 fftw 库。

添加类似以下内容:

-lfftw

这取决于库文件的实际名称。 (注意如何使用

-lm
对数学库执行此操作。)


0
投票

好吧 - 所以我还不确定这个答案,但我发现了一些关于现代 fftw 的东西(ala 2023)。该手册表明他们故意省略了一些接口声明。

编译,我目前得到

:~/代码/代码/apps$ gcc trans1.c -lfftw -lm /usr/bin/ld: /tmp/cc0OdR2j.o: 在函数

main': trans1.c:(.text+0x72): undefined reference to 
fftw_plan_dft_r2c_1d' 中 /usr/bin/ld: trans1.c:(.text+0x139): 对 `fftw_execute' 的未定义引用 collect2:错误:ld 返回 1 退出状态 :〜/代码/代码/应用程序$ 请注意我的代码调用 fftw_execute(plan);

引用他们的手册: fft.org http://fftw.org/fftw3.pdf
与旧版 Fortran 接口类似(请参阅第 8.3 节 [Fortran 中的 FFTW 执行],第 88 页),我们目前建议不要使用 fftw_execute,而是使用更专业的函数,如 fftw_execute_dft(请参阅第 4.6 节 [新数组执行函数],第 38 页)

为了防止您错误地使用fftw_execute, fftw3.f03 文件不提供 fftw_execute 接口声明。 ! 所以我要尝试 fftw_execute_dft(plan) 等,看看会发生什么。

fftw_执行。 fftw_execute_dft 。 fftw_execute_dft_c2r 。 fftw_execute_dft_r2c 。 fftw_execute_r2r 。 1 fftw_execute_split_dft 。 fftw_execute_split_dft_c2r。

© www.soinside.com 2019 - 2024. All rights reserved.