使用Armadillo调用FFTW3实现FFT遇LNK2019链接错误求助
解决Armadillo+FFTW3链接错误LNK2019: unresolved external symbol fftwf_destroy_plan
问题原因
错误中提到的fftwf_destroy_plan是FFTW3单精度版本的函数,而你当前仅链接了FFTW3的双精度库(fftw3),缺少单精度库(fftw3f)的链接,导致链接器找不到对应符号。Armadillo在启用FFTW3后,内部会根据不同数据类型调用单/双精度的FFTW函数,因此需要同时链接两种精度的库。
解决方案
1. 确认FFTW3已编译单精度库
确保你编译FFTW3时生成了单精度库(fftw3f.lib):
- 若用CMake编译FFTW3,需添加
-DFFTW_FLOAT=ON参数 - 若用configure脚本编译,需添加
--enable-float参数
2. 修改CMakeLists.txt,补充单精度库链接
将原CMake中的FFTW链接部分修改为同时链接双精度和单精度库,同时建议使用更规范的target_link_libraries替代全局的link_libraries,避免顺序问题:
# FFTW3配置 set(FFTW_INC_DIR D:/fftw-3.3.10.tar/fftw-3.3.10/fftw-3.3.10/api/) set(FFTW_LINK_DIR D:/fftw-3.3.10.tar/fftw-3.3.10/fftw-3.3.10/build/Release/) include_directories(${FFTW_INC_DIR}) link_directories(${FFTW_LINK_DIR}) # Armadillo配置 set(ARMA_INC_DIR D:/EndusV3/code/libExtern/armadillo-12.4.1/include) set(ARMA_LINK_DIR D:/EndusV3/code/libExtern/armadillo-12.4.1/lib_win64) include_directories(${ARMA_INC_DIR}) link_directories(${ARMA_LINK_DIR}) # 创建目标并链接库 add_executable(your_project_name main.cpp) target_link_libraries(your_project_name PRIVATE fftw3 fftw3f libopenblas)
3. 验证宏定义位置
确保#define ARMA_USE_FFTW3在包含Armadillo头文件之前,你的现有代码已经符合这个要求,保持即可:
#define ARMA_USE_FFTW3 #include <armadillo>
额外注意事项
- 确保FFTW3库的编译平台(x64)与你的项目平台一致,避免32/64位不匹配
- Armadillo 12.4.1与FFTW3 3.3.10版本是兼容的,版本不兼容不是导致此错误的原因
内容的提问来源于stack exchange,提问作者Azar
相关产品推荐
相关产品推荐

