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

Windows11下VS Code用CMake链接OpenCV C++库构建DLL报错求助

问题:Windows 11下使用CMake+Vcpkg构建OpenCV DLL时链接失败

我在Windows 11上尝试用CMake创建一个DLL,用于拆分单个USB端口输入的两路视频流供下游应用使用,但始终无法完成构建。已在VS Code中配置CMake v0.0.17和C/C++ v1.18.5扩展,通过vcpkg安装了OpenCV及相关依赖库。

设备规格

Processor   13th Gen Intel(R) Core(TM) i7-1355U   1.70 GHz
Installed RAM   16.0 GB (15.6 GB usable)
System type 64-bit operating system, x64-based processor
Pen and touch   Pen and touch support with 10 touch points

Windows规格

Edition Windows 11 Home
Version 23H2
Installed on    ‎12/‎23/‎2023
OS build    22631.3007
Experience  Windows Feature Experience Pack 1000.22681.1000.0

当前CMakeLists.txt配置

cmake_minimum_required(VERSION 3.10)
project(video_split_dll)

list(APPEND CMAKE_PREFIX_PATH "C:/Users/ctipp/vcpkg")  # Ensure vcpkg is in CMAKE_PREFIX_PATH

# Point to OpenCV4 specifically
set(OpenCV_DIR "C:/Users/ctipp/vcpkg/installed/x64-windows/share/opencv4")
set(OpenCV_LIB_DIR "C:/Users/ctipp/vcpkg/installed/x64-windows/lib")


# Adjust other package locations accordingly (if needed)
set(Protobuf_DIR "C:/Users/ctipp/vcpkg/installed/x64-windows/share/protobuf")
set(quirc_DIR "C:/Users/ctipp/vcpkg/installed/x64-windows/share/quirc")

# If using vcpkg-installed TIFF, adjust path accordingly
set(TIFF_INCLUDE_DIR "C:/Users/ctipp/vcpkg/installed/x64-windows/include")
set(TIFF_LIBRARY "C:/Users/ctipp/vcpkg/installed/x64-windows/lib/tiff.lib")

find_package(OpenCV REQUIRED PATHS "C:/Users/ctipp/vcpkg/installed/x64-windows/lib")
find_package(TIFF)
find_package(Protobuf)
find_package(quirc)


message("OpenCV library paths: ${OpenCV_LIB_DIR}")  # Print OpenCV library paths
message("OpenCV include paths: ${OpenCV_INCLUDE_DIRS}")  # Print OpenCV include paths
message("OpenCV libraries: ${OpenCV_LIBS}")  # Print OpenCV libraries
message("Linked libraries: ${CMAKE_EXE_LINKER_FLAGS}")  # Print linked libraries
include_directories(${OpenCV_INCLUDE_DIRS})
add_library(opencv_dll SHARED video_processing.cpp)
target_link_libraries(opencv_dll PRIVATE opencv_core opencv_imgproc)

对应的C++代码

#include <opencv2/opencv.hpp>

extern "C" {

    __declspec(dllexport) void process_image(const cv::Mat& input_image, cv::Mat& output_image) {
        // Perform image processing using OpenCV
        cv::cvtColor(input_image, output_image, cv::COLOR_BGR2GRAY);  // Example: Convert to grayscale
    }

}

遇到的具体问题

  • 使用vcpkg安装OpenCV时,会同时安装opencv和opencv4库
  • 在target_link_libraries中引用opencv4库时,构建提示无法定位库
  • 使用opencv库时,出现链接错误:undefined reference to cv::cvtColor(cv::_InputArray const&, cv::_OutputArray const&, int, int)

解决建议

1. 正确使用vcpkg的CMake工具链

vcpkg需要通过工具链文件集成CMake,避免手动设置大量路径。在VS Code的.vscode/settings.json中添加配置:

{
    "cmake.configureSettings": {
        "CMAKE_TOOLCHAIN_FILE": "C:/Users/ctipp/vcpkg/scripts/buildsystems/vcpkg.cmake"
    }
}

这会让CMake自动识别vcpkg安装的所有库,无需手动设置OpenCV_DIR、Protobuf_DIR等路径。

2. 修正OpenCV的find_package调用

vcpkg安装的是OpenCV4,正确的find_package命令应为:

find_package(OpenCV4 REQUIRED)

同时移除手动设置的OpenCV_DIR和OpenCV_LIB_DIR,让工具链自动处理路径匹配。

3. 使用正确的链接方式

不要手动指定opencv_core、opencv_imgproc,而是使用find_package返回的${OpenCV_LIBS}变量,确保链接所有必要的依赖:

target_link_libraries(opencv_dll PRIVATE ${OpenCV_LIBS})

4. 匹配构建类型与库版本

vcpkg会分别安装Debug和Release版本的库,确保CMake的构建类型与库版本一致。可在CMakeLists.txt中明确指定:

set(CMAKE_BUILD_TYPE Release) # 或者 Debug

如果需要同时支持两种类型,可使用CMAKE_CONFIGURATION_TYPES配置。

5. 检查C++接口导出的潜在问题

当前代码直接将cv::Mat作为extern "C"函数的参数,会导致兼容性问题(C语言无法识别C类)。后续若要让DLL被C或其他语言调用,建议改用C兼容的数据结构(比如传递图像缓冲区指针、宽高、通道数等),或者仅在C环境中使用该DLL。


内容的提问来源于stack exchange,提问作者user2384600

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 21:40:37