You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Aquila/C++编译出现未定义引用问题求助

解决Aquila库编译时的未定义引用错误

问题代码与环境

实现文件(fft.cpp)

#include "fft.h"
Aquila::SpectrumType ffm::FFT() 
{
    // WAV file.
    Aquila::WaveFile mywav("sound.wav");
    // input signal parameters
    const std::size_t SIZE = 52117000;
    const Aquila::FrequencyType sampleFreq = mywav.getSampleFrequency();
    const Aquila::FrequencyType f1 = 125, f2 = 700;

    Aquila::SineGenerator sineGenerator1 = Aquila::SineGenerator(sampleFreq);
    sineGenerator1.setAmplitude(32).setFrequency(f1).generate(SIZE);
    Aquila::SineGenerator sineGenerator2 = Aquila::SineGenerator(sampleFreq);
    sineGenerator2.setAmplitude(8).setFrequency(f2).setPhase(0.75).generate(SIZE);
    auto sum = sineGenerator1 + sineGenerator2;

    auto fft = Aquila::FftFactory::getFft(SIZE);
    Aquila::SpectrumType spectrum = fft->fft(sum.toArray());
    return spectrum;
}

头文件(fft.h)

#ifndef FFT_CLASS_H
#define FFT_CLASS_H
#include "../aquila/aquila/aquila.h"
#include "../aquila/aquila/global.h"
#include "../aquila/aquila/tools/TextPlot.h"
#include "../aquila/aquila/source/WaveFile.h"
#include "../aquila/aquila/source/generator/SineGenerator.h"
#include "../aquila/aquila/transform/FftFactory.h"
class ffm 
{
  public:

    Aquila::SpectrumType  FFT();
};

#endif

编译命令

g++ -o main.exe fft.cpp -L . -lAquila  -lOoura_fft

链接错误信息

c:/users/omanb/scoop/apps/gcc/current/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\omanb\AppData\Local\Temp\ccMPdyPz.o:fft.cpp:(.text+0x1bf): undefined reference to `Aquila::FftFactory::getFft(unsigned long long)'
c:/users/omanb/scoop/apps/gcc/current/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\omanb\AppData\Local\Temp\ccMPdyPz.o:fft.cpp:(.text+0x236): undefined reference to `Aquila::WaveFile::~WaveFile()'
c:/users/omanb/scoop/apps/gcc/current/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\omanb\AppData\Local\Temp\ccMPdyPz.o:fft.cpp:(.text+0x2bf): undefined reference to `Aquila::WaveFile::~WaveFile()'

排查与解决步骤

未定义引用错误本质是链接器无法找到对应函数的二进制实现,按以下顺序排查:

  1. 确认库文件路径与存在性

    • 编译命令中-L .指定当前目录为库搜索路径,需检查当前目录下是否存在libAquila.a/libAquila.dll和libOoura_fft.a/libOoura_fft.dll。
    • 若库文件不在当前目录,修改-L后的路径为实际库文件存放目录,例如-L ../aquila/lib。
  2. 调整库的链接顺序

    • GCC链接器对库的顺序有严格要求:依赖其他库的库必须放在被依赖库的后面。Aquila依赖Ooura_fft,因此调整编译命令为:
      g++ -o main.exe fft.cpp -L . -lOoura_fft -lAquila
      
  3. 验证库的编译架构匹配

    • 当前使用x86_64架构的MinGW编译器,需确保Aquila和Ooura_fft库是用同架构编译器编译的,禁止32位库与64位编译环境混用,反之亦然。
  4. 核对头文件与库版本一致性

    • 检查引用的头文件版本与链接的库文件版本是否完全一致,版本不兼容会导致符号匹配失败。
  5. 添加必要的编译宏定义

    • Aquila启用Ooura FFT后端时,可能需要显式定义宏AQUILA_USE_OOURA_FFT,修改编译命令:
      g++ -o main.exe fft.cpp -D AQUILA_USE_OOURA_FFT -L . -lOoura_fft -lAquila
      
  6. 直接指定静态库文件编译(可选)

    • 若动态库链接问题无法解决,可直接使用静态库文件路径编译:
      g++ -o main.exe fft.cpp ./libAquila.a ./libOoura_fft.a
      

内容的提问来源于stack exchange,提问作者poet5

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 17:48:20