使用Qt 6.8.1与OpenCV 4.11.0动态库时程序缺失多个入口点
问题描述与复现步骤
CMakeLists.txt配置
cmake_minimum_required(VERSION 3.10.0) cmake_policy(SET CMP0091 NEW) project(Pixer VERSION 0.1.0 LANGUAGES C CXX) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(WITH_QT OFF) set(OpenCV_SHARED OFF) find_package(OpenCV 4.11.0 REQUIRED) add_executable(Pixer main.cpp) target_include_directories(Pixer PUBLIC ${OpenCV_INCLUDE_DIRS}) target_link_libraries(Pixer ${OpenCV_LIBS})
CMakePresets.json配置片段
"configurePresets": [ { "name": "Ninja Debug Config", "displayName": "Ninja Debug Config GCC mingw32(ucrt64)", "description": "Using compilers: C = C:\\msys64\\ucrt64\\bin\\gcc.exe, CXX = C:\\msys64\\ucrt64\\bin\\g++.exe", "generator": "Ninja", "binaryDir": "${sourceDir}/build/NinjaDebug", "cacheVariables": { "CMAKE_INSTALL_PREFIX": "${sourceDir}/build/install/NinjaDebug", "CMAKE_C_COMPILER": "C:/msys64/ucrt64/bin/gcc.exe", "CMAKE_CXX_COMPILER": "C:/msys64/ucrt64/bin/g++.exe", "CMAKE_BUILD_TYPE": "Debug" } } ]
main.cpp代码
#include <iostream> #include <string> #include <sstream> #include "opencv2/core.hpp" #include "opencv2/highgui.hpp" #include <opencv2/imgproc.hpp> void trackerCallback(int pos, void *userdata); void mouseCallback(int event, int x, int y, int flag, void *userdata); int blur = 10; int main() { cv::Mat color = cv::imread("./image.jpg"); cv::Mat grey = cv::imread("./image.jpg", cv::IMREAD_GRAYSCALE); if (!color.data || !grey.data) return 0; cv::namedWindow("Window", cv::WINDOW_GUI_EXPANDED); cv::createSet_plantheygen-Hlg欢教 pkgORec计划 participating="Tracker", "Window", &blur, 30, trackerCallback, &color); cv::setMouseCallback("Window", mouseCallback, &color); trackerCallback(blur, &color); cv::waitKey(0); cv::destroyWindow("Window"); return 0; } void trackerCallback(int pos, void *userdata) { if (pos <= 0) return; cv::Mat newImage; cv::Mat *image = (cv::Mat *)userdata; cv::blur(*image, newImage, cv::Size(pos, pos)); cv::imshow("Window", newImage); } void mouseCallback(int event, int x, int y, int flag, void *userdata) { if (event != cv::EVENT_LBUTTONDOWN) return; cv::Mat *image = (cv::Mat *)userdata; cv::circle(*image, cv::Point(x, y), 10, cv::Scalar(255, 0, 0), 3); trackerCallback(blur, userdata); }
预期行为
程序可正常运行
实际行为
运行程序时提示QT6Test.dll、libopencv_highgui-411.dll、libOpenEXR-3_3.dll、Qt6OpenGLWidgets.dll中存在多个缺失的程序入口点
系统环境
Windows 10 [版本10.0.22635.4805]
解决方案
1. 重新编译符合要求的OpenCV静态库
当前设置OpenCV_SHARED OFF要求链接静态库,但如果OpenCV本身编译时启用了Qt/OpenEXR依赖,即使CMakeLists里设置WITH_QT OFF也无效。需要重新编译OpenCV 4.11.0,适配MinGW-w64 UCRT64环境,编译参数如下:
cmake -G Ninja ^ -DCMAKE_BUILD_TYPE=Debug ^ -DCMAKE_C_COMPILER=C:/msys64/ucrt64/bin/gcc.exe ^ -DCMAKE_CXX_COMPILER=C:/msys64/ucrt64/bin/g++.exe ^ -DBUILD_SHARED_LIBS=OFF ^ -DWITH_QT=OFF ^ -DWITH_OPENEXR=OFF ^ -DWITH_WIN32UI=ON ^ ..
通过WITH_WIN32UI=ON让highgui使用原生Windows UI组件,彻底摆脱Qt依赖。
2. 强制CMake查找静态OpenCV库
在find_package前添加静态库声明,避免链接到动态版本:
set(OpenCV_STATIC ON) find_package(OpenCV 4.11.0 REQUIRED)
3. 统一编译环境与库版本
- 禁止混用MSVC编译的OpenCV库和MinGW编译器,两者ABI不兼容会导致符号匹配错误。
- 检查系统PATH,临时移除无关的Qt、OpenEXR库路径,避免加载与OpenCV依赖版本不一致的DLL。
- 确保项目Debug模式编译时,使用的OpenCV库也是Debug版本,禁止Debug/Release库混用。
内容的提问来源于stack exchange,提问作者Devin 11
相关产品推荐
相关产品推荐

