为什么 fftw dll 中的函数不起作用?

问题描述

我有以下一段代码

#include <stdio.h>
#include "S:\fftw\fftw3.h"

int main()
{
    fftw_complex* in;
    fftw_complex* out;
    fftw_plan p;
    in = (fftw_complex*)fftw_malloc(sizeof(fftw_complex));
    out = (fftw_complex*)fftw_malloc(sizeof(fftw_complex));
    p = fftw_plan_dft_1d(1,in,out,FFTW_FORWARD,FFTW_ESTIMATE);
    fftw_execute(p);
    fftw_destroy_plan(p);
    fftw_free(in);
    fftw_free(out);
    printf("test!\n");
    return 0;
}

当我编译时

gcc -g .\test.c -o test S:\fftw\libfftw3-3.dll

并执行生成

test.exe

它确实执行没有错误,但不显示 printf 消息。如果我使用 gdb 并简单地在那里运行程序,无论我尝试什么,gdb 都会冻结并只提供以下输出

Starting program: S:\Notes\C\numerics\src\test.exe
[New Thread 8244.0x2a80]
[New Thread 8244.0x1668]
[New Thread 8244.0x4790]
[Thread 8244.0x1668 exited with code 3221225781]

这发生在我调用一个必须链接到 .dll 的函数的那一刻,如果我不这样做,一切都会正常。

我正在使用

gcc.exe (x86_64-win32-sjlj-rev0,由 MinGW-W64 项目构建) 8.1.0

GNU gdb (GDB) 8.1,此 GDB 配置为“x86_64-w64-mingw32”。

来自 MingW64,我只是从主页下载了 fftw .dll。

有人可以帮忙吗?我完全不知道这是关于什么的。

解决方法

从调试器中可以看到退出代码 3221225781,十六进制为 0xC0000135。 If you look it up on MS-ERREF,表示“STATUS_DLL_NOT_FOUND”和“{无法定位组件}此应用程序无法启动,因为未找到 %hs。重新安装应用程序可能会解决此问题。”

可能是应用程序找不到 activeByDefault。您需要将它放在可执行文件的同一目录中,或者放在 one of the other DLL search paths 中。

如果您从资源管理器(双击)启动应用程序,它还应该告诉您该消息,包括如果您继续获得相同的退出代码,它将无法找到的 DLL 名称。