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()'
排查与解决步骤
未定义引用错误本质是链接器无法找到对应函数的二进制实现,按以下顺序排查:
确认库文件路径与存在性
- 编译命令中
-L .指定当前目录为库搜索路径,需检查当前目录下是否存在libAquila.a/libAquila.dll和libOoura_fft.a/libOoura_fft.dll。 - 若库文件不在当前目录,修改
-L后的路径为实际库文件存放目录,例如-L ../aquila/lib。
- 编译命令中
调整库的链接顺序
- GCC链接器对库的顺序有严格要求:依赖其他库的库必须放在被依赖库的后面。Aquila依赖Ooura_fft,因此调整编译命令为:
g++ -o main.exe fft.cpp -L . -lOoura_fft -lAquila
- GCC链接器对库的顺序有严格要求:依赖其他库的库必须放在被依赖库的后面。Aquila依赖Ooura_fft,因此调整编译命令为:
验证库的编译架构匹配
- 当前使用x86_64架构的MinGW编译器,需确保Aquila和Ooura_fft库是用同架构编译器编译的,禁止32位库与64位编译环境混用,反之亦然。
核对头文件与库版本一致性
- 检查引用的头文件版本与链接的库文件版本是否完全一致,版本不兼容会导致符号匹配失败。
添加必要的编译宏定义
- Aquila启用Ooura FFT后端时,可能需要显式定义宏
AQUILA_USE_OOURA_FFT,修改编译命令:g++ -o main.exe fft.cpp -D AQUILA_USE_OOURA_FFT -L . -lOoura_fft -lAquila
- Aquila启用Ooura FFT后端时,可能需要显式定义宏
直接指定静态库文件编译(可选)
- 若动态库链接问题无法解决,可直接使用静态库文件路径编译:
g++ -o main.exe fft.cpp ./libAquila.a ./libOoura_fft.a
- 若动态库链接问题无法解决,可直接使用静态库文件路径编译:
内容的提问来源于stack exchange,提问作者poet5
相关产品推荐
相关产品推荐

