首页 > 其他分享 >cmake配置VS工程配置使用dll

cmake配置VS工程配置使用dll

时间:2024-06-01 17:14:34浏览次数:27  
标签:文件 cmake x64 dll VS PATH

cmake配置VS工程配置使用dll

Author: ChrisZZ
Time: 2024-06-01 16:17:04

目录

1. 目的

使用 CMake 生成 Visual Studio 的 .sln 解决方案文件后, 可执行目标如果依赖了 dll 文件, 在 VS 中运行或调试程序时,需要能找到这些 dll。 有这个几个问题:

  • 如果找不到 dll, 会发生什么?
  • 需要找到哪些 dll?
  • 找到 dll 后放到哪里?

2. 如果找不到 dll, 会发生什么?

可能会弹窗提示, xxx.dll 没找到。 此时程序无法继续运行。 这种比较直观友好。

也可能没有弹窗提示, 黑框框控制台里可能有一句提示, 但打印太多被你忽略了。 程序能继续运行, 但结果不符合预期。 典型情况是 opencv_videoio490_ffmpeg.dll 文件, 获取到的视频帧数为-1.

3. 需要找到哪些 dll?

用到哪些 dll, 就找哪些。 如何确定用到了哪些 dll 文件?

3.1 “就那么几个文件,手动拷贝“

“我的工程很简单, 就需要4个dll, 分别是 protobuf 的一个, opencv 的两个, ncnn 的一个”

这种想法可以临时解决问题, 也带来新的问题:

  • 原始的 dll 文件在哪里, 如何找到?
  • 如果原始的 protobuf/opencv/ncnn 版本升级, dll 文件如何处理?
  • 如果本机和另一台机器的 dll 版本不同, 导致运行结果有问题, 是不是在给自己找麻烦?
  • 找到的 dll 文件, 应该拷贝到哪里?
    • 放系统 PATH 环境变量吗?
    • 放当前 VS 工程目录吗?
      • 为什么 debug 和 release 模式要分别拷贝一次?

3.2 从依赖树递归查询

“我的项目使用 modern cmake 的方式标注依赖关系, 依赖关系是一棵树, 根节点是可执行目标, 从根节点遍历整个依赖树, 扫描出 dll 文件”

这种想法是通用的, 是 scalable 的。 查找 dll 的递归过程, 如果你会写 leetcode 就应该能用 cmake 写出。

具体的依赖写法, 可以是手动的、逐 target 标注依赖关系,也可以基于包管理器, 这里略过。

3.3 额外的 dll 文件

VS2022 从 17.7 版本开始, 无论是 MT(d) 还是 MD(d), 开启 Address Sanitizer 的编译链接选项 /fsanitize=address后, 都只需要一个对应的 ASAN 的 dll 文件。

这个 dll 算是链接选项隐式引入的。 在配置找到其他 dll 文件时, 如果处理不当, 可能会把这一 dll 文件变得不再能被找到。

4. 找到 dll 后放到哪里?

如果打算拷贝 dll 到 VS 的工程路径, 那么或多或少要经历“失败“:

  • VS 的运行路径是什么?
  • exe 文件的所在路径是什么?
  • 工作路径(workding directory)是什么?

也有人觉得,放 PATH 里最省事, 比如经典的配置 OpenCV, 把 d:/pkgs/opencv/4.8.0/build/x64/vc16/bin 目录放到 PATH 环境变量中。 这种做法, 一旦遇到系统需要有多份同名 dll 文件时, 就容易冲突。

其实, 只要让 VS 的运行或调试阶段找到 dll 文件就行了, 其他时候不需要找到。 那么只要关心,如何在 VS 工程中, 临时设定 dll 的查询路径即可。 也就是临时修改可执行文件的 PATH 环境变量。

4.1 VS 工程属性中的调试环境设定

从 VS 工程属性角度来讲, 工程 -> 属性 -> 调试 -> 环境, 设定 PATH 的取值为 “包含所需的 dll 的路径” 即可。

例如默认是 PATH=$(VC_Executable_x64);%PATH%.

可以改为 PATH=$(VC_Executable_x64);%PATH%;D:/pkgs/opencv/4.8.0/build/x64/vc16/bin.

4.2 通过 cmake 设置

可以逐个 target 设置 VS_DEBUGGER_ENVIRONMENT 属性:

set_target_properties(demo PROPERTIES
    VS_DEBUGGER_ENVIRONMENT "PATH=D:/pkgs/opencv/4.8.0/build/x64/vc16/bin;%PATH%"
)

也可以设置 CMAKE_VS_DEBUGGER_ENVIRONMENT 这一全局属性, 它用来初始化 VS_DEBUGGER_ENVIRONMENT 取值。

set(CMAKE_VS_DEBUGGER_ENVIRONMENT "D:/pkgs/opencv/4.8.0/build/x64/vc16/bin")

上述两个写法, 在没有开启 ASAN 的时候都是可以正常使用的。

4.3 cmake 设置 - 处理 ASAN

VS2022 通常使用 ASAN 的 dll 文件, 也就是动态库。 在前一节设定的方式写法下, 会把临时设置的 PATH 中原本继承的 $(VC_Executable_x64) 这一 VS 工程宏(取值为 cl.exe 所在目录)删除。 这导致了 ASAN 的 dll 文件找不到。

我的解决方法是, 在引入 ASAN 选项的时候,设定 CMAKE_VS_DEBUGGER_ENVIRONMENT$(VC_Executable_x64). 这个全局的cmake变量, 会被追加到每个target的 VS_DEBUGGER_ENVIRONMENT 属性上, 每个 target 只需要增加设置需要的 dll 路径即可。

标签:文件,cmake,x64,dll,VS,PATH
From: https://www.cnblogs.com/zjutzz/p/18226140

相关文章

  • vcruntime140.dll丢失如何安装,附找不到vcruntime140.dll的六种解决方法
    vcruntime140.dll是一个动态链接库文件,属于MicrosoftVisualC++RedistributablePackages的一部分,专为VisualStudio2015开发环境设计。它提供了C运行时库(CRT)中的一些关键功能,以及一些额外的Microsoft特定的运行时功能。这些功能包括但不限于内存分配与释放、数学计算、字符......
  • 写一个 vscode 插件
    HxTranslate这是一个vscode扩展插件示例,参考:YourFirstExtension,可将helloworld更改为自己的扩展插件名称如:HxTranslate,其余默认即可.建议使用文心一言解答疑问.注意事项deepin终端运行:sudoaptinstallnodejs终端运行:npmi-gyogenerator-codety......
  • 制作可以用来控制vsftpd服务的菜单
    1:创建菜单函数文件#vimmenu#创建文件x=1#高亮行号,默认为1即可y=0#第几行menu(){#循环显示菜单的函数clearforiin1,安装ftp服务2,开关ftp服务3,退出......
  • 算法金 | 详解过拟合和欠拟合!性感妩媚 VS 大杀四方
    大侠幸会,在下全网同名「算法金」0基础转AI上岸,多个算法赛Top「日更万日,让更多人享受智能乐趣」今天我们来战过拟合和欠拟合,特别是令江湖侠客闻风丧胆的过拟合,简称过儿,Emmm过儿听起来有点怪怪的1.楔子机器学习模型是一种能够从数据中学习规律并进行预测的......
  • vs2022安装 社区版/Visual Studio 2022 Professional、Enterprise安装教程
    原文链接:https://zhuanlan.zhihu.com/p/472099786https://blog.csdn.net/qq_38390060/article/details/129580789一、Windows安装VisualStudio20221.1下载地址首先登陆VisualStudio官网:https://visualstudio.microsoft.com/zh-hans/ 2、我们双击开始安装之后会弹出安......
  • 海康威视工业相机通过MVS修改IP
    相机型号:修改IP点开MVS软件后,左侧GigE会出现网卡的静态IP,如图想要修改相机IP,首先需要修改电脑的网络设置,设置成自己想要的IP段修改好之后,相机的图标会变为黄色感叹号,表示不能连接此时双击相机,则可设置IP(IP段始终和电脑网卡的IP段保持一致,不能跨段设置)查......
  • 安防监控视频平台LntonCVS视频监控汇聚平台遏制校园暴力保护校园学生安全应用方案
    未成年人被誉为祖国的花朵,是我们国家的未来。然而,最近频繁曝出的未成年霸凌事件却引发了社会的广泛关注。这些事件手段残忍,事态恶劣,引发了全社会对如何保护未成年身心健康、规避霸凌事件发生的深刻思考。为了更好地保障学生的安全,许多学校开始引入基于“AI+视频”技术的人工......
  • 视频融合共享平台LntonCVS视频联网共享平台养殖场应用解决方案
    在当今的畜牧业中,养殖场面临着诸多挑战,如养殖密集、流动量大、差异性大以及环境污染等问题。同时,动物疫情防控、设备设施不完善和政府监管薄弱等情况也给养殖场带来了困扰。因此,智能化养殖已经成为现代畜牧业的发展趋势。为了应对这些挑战,我们提出了基于AI智能分析网关平台Ln......
  • 视频汇聚共享平台LntonCVS智能视频监控平台智慧城建应用方案
    随着城市建设正在全面展开,城市框架已初步形成,涵盖公共体育设施、绿地公园、道路网络等多个领域,城市雏形正在加速显现。然而,在推进城市建设的同时,施工安全必须作为基石,确保建设进程安全有序。本文将探讨如何通过“AI+视频”技术实现施工场地智慧化监管。行业现状:1.监管挑战:......
  • 安防监控视频平台LntonCVS视频监控汇聚平台遏制校园暴力保护校园学生安全应用方案
    未成年人被誉为祖国的花朵,是我们国家的未来。然而,最近频繁曝出的未成年霸凌事件却引发了社会的广泛关注。这些事件手段残忍,事态恶劣,引发了全社会对如何保护未成年身心健康、规避霸凌事件发生的深刻思考。为了更好地保障学生的安全,许多学校开始引入基于“AI+视频”技术的人工......