Qt5 minGW undefined reference to...错误

本文分享了在使用Qt5进行GUI开发时遇到的undefined reference to错误及解决方案。通过在.pro文件中添加特定条件语句,成功解决了Qt5环境下GoToCellDialog示例项目的编译问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

         刚刚接触Qt,根据Blanchette《C++ GUI Qt4 编程》书籍的例子,写的GoToCellDialog例子,用Qt designer绘制界面,用命令编译出现了很多undefined reference to错误,Google一下,网上列举的错误有以下三种:

1. 环境变量没有设置好;

2. 连接器问题。

3. xxx.pro文件QT有问题

环境变量设置没有错误(QTDIR=C:\Qt\Qt5.0.1\5.0.1\mingw47_32)

连接器也没有问题(C:\Qt\Qt5.0.1\5.0.1\mingw47_32\lib)

xxx.pro文件加上QT += gui core,还是不行。

错误如下: 

后来发现在xxx.pro文件里面添加:greaterThan(QT_MAJOR_VERSION, 4): QT += widgets语句,重新qmake xxx.pro  再执行make,就可以成功。

百度一下,greaterThan:如果 Qt 的主版本号(QT_MAJOR_VERSION)大于 4,则需要另外添加 widgets(因为在 Qt 5 中,所有组件都是在 widgets 模块定义的).




<think>我们遇到了一个新的错误:`undefinedreference to__imp_timeGetTime`。这个错误与之前解决的`__imp_WSAStartup`类似,都是Windows平台特有的链接错误。这次缺失的是`winmm.lib`库(包含`timeGetTime`函数)。 ##解决方案###步骤1:修改CMakeLists.txt添加`winmm.lib`链接在CMake配置文件中添加对`winmm`库的链接: ```cmakeif(WIN32)#添加Windows多媒体库(包含timeGetTime)target_link_libraries(YourTargetName PRIVATE winmm)endif()``` ###步骤2:确保代码包含正确的头文件在调用`timeGetTime`的源文件中包含`<windows.h>`或`<mmsystem.h>`:```cpp#include<windows.h>//包含timeGetTime的声明//或者#include<mmsystem.h>//更精确的多媒体头文件``` ###步骤3:完整CMakeLists.txt示例```cmakecmake_minimum_required(VERSION3.16) project(YourProject)set(CMAKE_CXX_STANDARD17)set(CMAKE_AUTOMOCON)set(CMAKE_AUTORCCON)set(CMAKE_AUTOUICON)find_package(Qt6COMPONENTS CoreREQUIRED) #根据实际使用的模块调整add_executable(YourAppmain.cpp# ...其他源文件... )target_link_libraries(YourApp PRIVATEQt6::Core) #Windows平台专用库if(WIN32)target_link_libraries(YourApp PRIVATEws2_32#网络相关(如果用到)winmm#多媒体计时器) endif() ```###步骤4:清理并重新构建```bash#清理旧构建rm-rfbuild#重新生成构建系统mkdirbuild &&cd buildcmake -G "MinGWMakefiles" ..#或使用您的生成器(如Visual Studio) #重新编译cmake--build. ```##错误原因- `timeGetTime`属于Windows多媒体计时器API,定义在`winmm.lib`中- CMake不会自动链接平台特定库,需显式指定-32/64位库不匹配也可能导致类似错误(确保生成器与架构匹配)>**注意**:在Qt项目中,通常不需要直接调用`timeGetTime`,因为Qt提供了跨平台的计时器类`QTimer`和`QElapsedTimer`。建议优先使用Qt的计时器[^1]。 ##替代方案(使用Qt计时器) 如果可能,建议替换为Qt的计时器:```cpp#include<QElapsedTimer>QElapsedTimertimer;timer.start();//...qint64 elapsed= timer.elapsed(); //获取经过的毫秒数```这样代码将具有更好的跨平台性。##引用说明-引用[1]提到`timeGetTime`相关的链接错误,解决方案是添加`winmm.lib`(在CMake中对应`winmm`)[^1]-引用[3]展示了使用定时器的代码,但使用的是dlib库的定时器,与当前问题无关[^3]§§相关问题§§1.如何在Qt中实现高精度计时? 2. CMake中如何为不同平台(Windows/Linux/macOS)配置不同的库链接? 3.除了`winmm.lib`,Windows平台还有哪些常用库需要显式链接?</think>### 解决 QT 中 `undefined reference to __imp_timeGetTime` 错误 这个错误是由于 **未正确链接 Windows 多媒体库** (`winmm.lib`) 导致的。以下是完整的解决方案: #### 解决方案步骤 1. **修改 CMakeLists.txt 添加链接库** 在 CMake 配置文件中添加以下内容: ```cmake if(WIN32) # 添加 Windows 多媒体库(包含 timeGetTime) target_link_libraries(YourTarget PRIVATE winmm) endif() ``` 2. **确保包含正确的头文件** 在调用 `timeGetTime` 的源文件中添加: ```cpp #include <windows.h> // 基础 Windows API #include <mmsystem.h> // 多媒体计时器专用头文件 #pragma comment(lib, "winmm.lib") // 可选:MSVC 的链接指令 ``` 3. **完整 CMakeLists.txt 示例** ```cmake cmake_minimum_required(VERSION 3.16) project(YourProject) set(CMAKE_CXX_STANDARD 17) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON) find_package(Qt6 COMPONENTS Core REQUIRED) add_executable(YourApp main.cpp # ... 其他源文件 ... ) target_link_libraries(YourApp PRIVATE Qt6::Core) # Windows 专用库 if(WIN32) target_link_libraries(YourApp PRIVATE winmm # 多媒体计时器 ws2_32 # 如果用到网络功能 ) endif() ``` 4. **使用 Qt 替代方案(推荐)** 优先使用 Qt 自带的计时器,避免平台依赖: ```cpp #include <QElapsedTimer> QElapsedTimer timer; timer.start(); // ... qint64 elapsed = timer.elapsed(); // 获取毫秒数 ``` #### 错误原因分析 - `timeGetTime` 属于 Windows 多媒体计时器 API,定义在 `winmm.lib` 中 - CMake 不会自动链接 Windows 特定库,需显式指定 - 32/64 位库不匹配可能导致类似错误(确保 CMake 生成器与架构匹配) - Qt 的某些底层模块(如网络或多媒体)可能间接调用这些 API[^1] #### 验证是否解决 ```bash # 清理并重新构建 rm -rf build mkdir build && cd build cmake -G "MinGW Makefiles" .. # 确保与编译器匹配 cmake --build . ``` > **关键提示**:在 Qt 项目中,优先使用 `QTimer` 或 `QElapsedTimer` 等跨平台计时器,可避免此类平台特定问题[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值