如何整合CMake与含NuGet包的VS C++项目并调用ONNX/OpenCV?
CMake项目集成NuGet包及相关整合方案
一、给CMake项目添加NuGet包的可行方案
1. 命令行下载+CMake手动配置(跨平台通用)
利用NuGet命令行工具下载包,再在CMakeLists中手动指定头文件和库路径:
# 示例:安装ONNX Runtime NuGet包 execute_process( COMMAND nuget install Microsoft.ML.OnnxRuntime -Version 1.16.3 -OutputDirectory ${CMAKE_BINARY_DIR}/nuget_packages WORKING_DIRECTORY ${CMAKE_BINARY_DIR} RESULT_VARIABLE NUGET_INSTALL_RESULT ) if(NOT NUGET_INSTALL_RESULT EQUAL 0) message(FATAL_ERROR "Failed to install ONNX Runtime NuGet package") endif() # 查找头文件 find_path(ONNXRUNTIME_INCLUDE_DIR NAMES onnxruntime_cxx_api.h PATHS ${CMAKE_BINARY_DIR}/nuget_packages/Microsoft.ML.OnnxRuntime.*/build/native/include ) # 查找链接库(匹配当前平台和构建类型) find_library(ONNXRUNTIME_LIBRARY NAMES onnxruntime.lib PATHS ${CMAKE_BINARY_DIR}/nuget_packages/Microsoft.ML.OnnxRuntime.*/build/native/lib/${CMAKE_VS_PLATFORM_NAME}/${CMAKE_BUILD_TYPE} ) # 关联到目标项目 target_include_directories(your_target_project PRIVATE ${ONNXRUNTIME_INCLUDE_DIR}) target_link_libraries(your_target_project PRIVATE ${ONNXRUNTIME_LIBRARY})
注意:需确保系统已安装NuGet命令行工具,跨平台时要调整库路径的平台判断逻辑。
2. Visual Studio集成方式(仅VS环境)
如果用Visual Studio打开CMake项目,右键点击项目 → 管理NuGet程序包,直接搜索安装所需的ONNX、OpenCV包。VS会自动生成PackageReference或packages.config,CMake 3.21+版本可自动识别这些依赖,无需手动配置路径。
二、直接解压NuGet包使用.dll/.lib的可行性
完全可行。NuGet包本质是ZIP压缩文件,解压后通常在build/native目录包含头文件、静态库/动态库,runtimes目录分平台存放运行时.dll。
- 操作步骤:手动解压包到项目指定目录,在CMakeLists中直接指定头文件目录和库文件路径,和普通第三方库一样处理。
- 注意事项:要匹配项目的平台架构(x86/x64/ARM)和构建类型(Debug/Release),部分包的Debug库会带
d后缀(如opencv_world480d.lib);运行时需将对应.dll复制到项目输出目录,可通过add_custom_command实现:
add_custom_command(TARGET your_target_project POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_SOURCE_DIR}/path/to/onnxruntime.dll" $<TARGET_FILE_DIR:your_target_project> )
三、CMake项目与含NuGet包的VS C++项目整合
1. 将VS项目作为外部依赖构建
用ExternalProject_Add调用MSBuild构建VS项目,再链接其输出库:
ExternalProject_Add( vs_nuget_dep_project SOURCE_DIR ${CMAKE_SOURCE_DIR}/path/to/vs_project BINARY_DIR ${CMAKE_BINARY_DIR}/vs_project_build COMMAND msbuild ${CMAKE_SOURCE_DIR}/path/to/vs_project/your_vs_project.vcxproj /p:Configuration=${CMAKE_BUILD_TYPE},Platform=${CMAKE_VS_PLATFORM_NAME} INSTALL_COMMAND "" ) # 让CMake项目依赖VS项目的构建结果 add_dependencies(your_cmake_target vs_nuget_dep_project) # 链接VS项目的输出库 find_library(VS_PROJECT_LIB NAMES your_vs_project.lib PATHS ${CMAKE_BINARY_DIR}/vs_project_build/${CMAKE_BUILD_TYPE} ) target_link_libraries(your_cmake_target PRIVATE ${VS_PROJECT_LIB})
2. VS解决方案手动整合
用CMake生成VS解决方案后,手动将现有VS C++项目添加到解决方案中:
- 在VS中右键解决方案 → 添加 → 现有项目,选择VS项目的
.vcxproj文件; - 右键CMake项目 → 项目依赖,勾选VS项目,确保构建顺序正确;
- 在CMakeLists中链接VS项目的输出库,路径指向VS项目的构建输出目录即可。
内容的提问来源于stack exchange,提问作者komeil sh
相关产品推荐
相关产品推荐

