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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 05:24:52