首页 > 解决方案 > 在 Mac 上使用 CMAKE 将 FFTW 和 FFTWPP 链接到项目中时未定义的符号

问题描述

我正在为我用 C++ 编写的 Biquad Filter 类编写测试,并且我正在尝试使用 FFTWPP 标头来简化 FFTW 库的使用。我已经成功构建并运行了FFTWPP 示例,因此我可以确定 FFTW3 库已成功构建并安装在我的 Mac 上(运行 OS Catalina 10.15.5 (19F101))。我已设法将 FFTW lib 目录包含到 cmake 项目定义中,并将适当的包含路径添加到 CMAKE 文件中:

cmake_minimum_required(VERSION 3.16)
project(IIR)

set(CMAKE_CXX_STANDARD 14)

find_package(Python 3.7 COMPONENTS Development) # Used for MatplotlibPP

include_directories(.)
include_directories(./../../../fftwpp/)
include_directories(./../../../fftw-3.3.8/api/)
include_directories(./../../../matplotlib-cpp/) #Plotting
include_directories(./../../../AudioFile/) #AudiofileIO
include_directories(/usr/local/include) # contains includes for FFTW3

link_directories(.)
link_directories(/usr/local/lib)# contains binary for FFTW3
find_library(
        fftw3
        NAMES fftw lfftw3 libfftw3
        HINTS /usr/local/lib
)

add_executable(IIR
        Test_BiquadFilter.cpp)

target_link_libraries(IIR PUBLIC Python fftw3)

但是,链接器似乎无法通过 FFTWPP 标头链接符号:

[100%] Linking CXX executable IIR
Undefined symbols for architecture x86_64:
  "fftwpp::ThreadBase::ThreadBase()", referenced from:
      fftwpp::fftw::fftw(unsigned int, int, unsigned int, unsigned int) in Test_BiquadFilter.cpp.o
  "fftwpp::fftw::maxthreads", referenced from:
      _main in Test_BiquadFilter.cpp.o
      fftwpp::fftw::Setup(std::__1::complex<double>*, std::__1::complex<double>*) in Test_BiquadFilter.cpp.o
  "fftwpp::fftw::testseconds", referenced from:
      fftwpp::fftw::time(fftw_plan_s*, fftw_plan_s*, std::__1::complex<double>*, std::__1::complex<double>*, unsigned int) in Test_BiquadFilter.cpp.o
  "fftwpp::fftw::effort", referenced from:
      fftwpp::rcfft1d::Plan(std::__1::complex<double>*, std::__1::complex<double>*) in Test_BiquadFilter.cpp.o
      fftwpp::crfft1d::Plan(std::__1::complex<double>*, std::__1::complex<double>*) in Test_BiquadFilter.cpp.o
  "fftwpp::fftw::planner", referenced from:
      fftwpp::fftw::Setup(std::__1::complex<double>*, std::__1::complex<double>*) in Test_BiquadFilter.cpp.o
  "fftwpp::inout", referenced from:
      fftwpp::fftw::Setout(std::__1::complex<double>*, std::__1::complex<double>*) in Test_BiquadFilter.cpp.o
  "fftwpp::crfft1d::threadtable", referenced from:
      fftwpp::crfft1d::lookup(bool, unsigned int) in Test_BiquadFilter.cpp.o
      fftwpp::crfft1d::store(bool, fftwpp::threaddata const&) in Test_BiquadFilter.cpp.o
  "fftwpp::rcfft1d::threadtable", referenced from:
      fftwpp::rcfft1d::lookup(bool, unsigned int) in Test_BiquadFilter.cpp.o
      fftwpp::rcfft1d::store(bool, fftwpp::threaddata const&) in Test_BiquadFilter.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我是否应该将 FFTW 库与 FFTWPP 链接并将其构建为自己的库,然后将该库与我的项目链接?我知道我可能不必要地向 Cmake 项目添加了一些额外的部分,但是当以这种方式链接库时,我的 CMake 配置是否因其他原因不正确?

非常感谢,

标签: c++cmakefftw

解决方案


正如评论者对原始帖子的友好指出的那样,我的问题的答案是我没有链接到 FFTWPP。

解决方案是将 FFTWPP 作为库添加到项目中,并将该库添加到目标链接库列表中。


link_directories(./../../../fftwpp/)
find_library(
        fftw3
        NAMES fftw lfftw3 libfftw3
        HINTS /usr/local/lib
)

add_library(fftwpp STATIC ./../../../fftwpp/fftw++.cc)
add_executable(IIR
        Test_BiquadFilter.cpp)

target_link_libraries(IIR PUBLIC Python fftw3 fftwpp)

推荐阅读