在 linux 环境中使用 cmake 包含 fftw3.h

Inlcude fftw3.h with cmake in a linux environment

我想使用 fftw 库。

在我的 cpp 文件中,我将其包含为 #include <fftw3.h>

我下载了库并将其保存在./fftw 然后我输入:

cd fftw
./configure
make
make install
cd ..

在我的项目中我已经在使用 OpenCV,所以我的 CMakeLists.txt 是:

cmake_minimum_required(VERSION 2.8) # CMake version check
project( main ) 
find_package( OpenCV REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )
add_executable( main main.cpp )
# set(CMAKE_BUILD_TYPE Debug)
target_link_libraries( main ${OpenCV_LIBS} )
target_link_libraries( main ./fftw)

最后我执行了 cmake CMakeLists.txt 但是当我尝试 make 我的可执行文件时,它抱怨说 fftw3.h: 没有那个文件或目录。

我怎样才能让它发挥作用?

谢谢。

您还可以使用 ./configure --prefix /where/you/want/to/install 设置要安装库的目录,然后确保 运行 make install./fftw 目录中。

根据路径和权限,您可能需要使用 sudo make install

更改您的 CMakeLists.txt 以包括以下内容:

cmake_minimum_required(VERSION 2.8) # CMake version check
project( main ) 
find_package( OpenCV REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )
add_executable( main main.cpp )
# set(CMAKE_BUILD_TYPE Debug)
target_link_libraries( main ${OpenCV_LIBS} )
target_link_libraries( main fftw3 )

然后执行cmake CMakeLists.txt最后make


以上版本在以下平台上正确构建:

OS: Ubuntu Linux 21.04

内核: 5.11.0-34-generic

cmake 版本:3.18.4

g++:10.3.0


使用的示例main.cpp:

#include <fftw3.h>

#define NUM_POINTS 64


#include <stdio.h>
#include <math.h>

#define REAL 0
#define IMAG 1

void acquire_from_somewhere(fftw_complex* signal) {
    /* Generate two sine waves of different frequencies and
     * amplitudes.
     */

    int i;
    for (i = 0; i < NUM_POINTS; ++i) {
        double theta = (double)i / (double)NUM_POINTS * M_PI;

        signal[i][REAL] = 1.0 * cos(10.0 * theta) +
                          0.5 * cos(25.0 * theta);

        signal[i][IMAG] = 1.0 * sin(10.0 * theta) +
                          0.5 * sin(25.0 * theta);
    }
}

void do_something_with(fftw_complex* result) {
    int i;
    for (i = 0; i < NUM_POINTS; ++i) {
        double mag = sqrt(result[i][REAL] * result[i][REAL] +
                          result[i][IMAG] * result[i][IMAG]);

        printf("%g\n", mag);
    }
}


int main() {
    fftw_complex signal[NUM_POINTS];
    fftw_complex result[NUM_POINTS];

    fftw_plan plan = fftw_plan_dft_1d(NUM_POINTS,
                                      signal,
                                      result,
                                      FFTW_FORWARD,
                                      FFTW_ESTIMATE);

    acquire_from_somewhere(signal);
    fftw_execute(plan);
    do_something_with(result);

    fftw_destroy_plan(plan);

    return 0;
}