在 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;
}
我想使用 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;
}