Search code examples
c++cmakefftw

Inlcude fftw3.h with cmake in a linux environment


I want to use fftw library.

In my cpp file I included as #include <fftw3.h>

I downloaded the library and I saved it in ./fftw Then I typed:

cd fftw
./configure
make
make install
cd ..

In my project I am already using OpenCV, so my CMakeLists.txt is:

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)

Finally I execute cmake CMakeLists.txt but when I try to make my executable, it complains that fftw3.h: No such file or directory.

How could I make it work?

Thanks.


Solution

  • You can also use ./configure --prefix /where/you/want/to/install to set the directory you want the library to be installed in then make sure that you run make install inside ./fftw directory.

    You may need to use sudo make install depending on the path and permissions.

    Change your CMakeLists.txt to include the following:

    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 )
    

    Then execute cmake CMakeLists.txt and finally make


    The above build's correctly on the following platform:

    OS: Ubuntu Linux 21.04

    Kernel: 5.11.0-34-generic

    cmake Version: 3.18.4

    g++: 10.3.0


    Example main.cpp used:

    #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;
    }