在Qt Creator中使用pffft库时遭遇LNK2019链接错误
Qt Creator + CMake 引入pffft库遇LNK2019未解析外部符号问题解决
问题场景
用Qt Creator 12.0.1 + CMake构建Qt 6.6.2应用(Windows 10系统,MSVC 2019编译器),因项目需求引入轻量FFT库pffft(仅包含pffft.h头文件和pffft.c实现文件)。已将这两个文件添加至CMakeLists.txt,且源文件正确包含头文件,但构建时所有调用pffft库的函数均触发LNK2019未解析外部符号错误,最终导致链接失败。
之前尝试的操作及遇到的新问题:
- 修改CMake的
project指令为LANGUAGES CXX C:LNK2019错误消失,但出现编译器目录下的C1189标准库使用错误 - 切换至MinGW编译器:LNK2019错误消失,但自动生成的UI头文件找不到
qcustomplot.h - 确认
pffft.h中已正确添加extern "C"声明
针对性解决方案
方案1:单独编译pffft为静态库(推荐,规避C/C++编译标准冲突)
将pffft.c单独编译成静态库,再链接到Qt项目,可给C文件单独指定编译标准,避免与C++标准冲突:
# 把pffft编译为静态库 add_library(pffft STATIC pffft.c) # 指定pffft使用C99标准(pffft基本兼容C99) target_compile_features(pffft PRIVATE c_std_99) # 可选:添加优化编译选项 target_compile_options(pffft PRIVATE /O2) # 你的Qt项目目标 add_executable(YourQtApp main.cpp 其他源文件...) # 链接pffft静态库与Qt模块 target_link_libraries(YourQtApp PRIVATE pffft Qt6::Widgets 其他Qt模块...)
同时再次确认pffft.h的extern "C"包裹正确:
#ifdef __cplusplus extern "C" { #endif // pffft的所有函数声明 #ifdef __cplusplus } #endif
方案2:调整MSVC的C/C++编译标准兼容
若不想单独编译静态库,修改project指令为LANGUAGES CXX C后,给C和C++文件分别指定编译标准,解决C1189错误:
project(YourQtApp LANGUAGES CXX C) # 设置C++标准为Qt默认的C++17或更高 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 设置C标准为C99(适配pffft) set(CMAKE_C_STANDARD 99) set(CMAKE_C_STANDARD_REQUIRED ON) # 添加所有源文件,确保pffft.c被识别为C文件 add_executable(YourQtApp main.cpp pffft.c 其他源文件...) target_link_libraries(YourQtApp PRIVATE Qt6::Widgets 其他Qt模块...)
若仍有C标准相关警告或错误,可在CMake中添加以下选项屏蔽:
target_compile_options(YourQtApp PRIVATE $<$<COMPILE_LANGUAGE:C>:/wd4996>)
方案3:修复MinGW下qcustomplot.h找不到的问题
若想继续使用MinGW,解决UI头文件找不到qcustomplot.h的问题:
- 在CMakeLists.txt中添加qcustomplot的头文件目录:
target_include_directories(YourQtApp PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/qcustomplot所在目录)
- 确保qcustomplot的头文件、源文件(若有)已正确添加到项目,或已编译为库并链接至项目。
内容的提问来源于stack exchange,提问作者AristoFane
相关产品推荐
相关产品推荐

