vs2019 c++开发软件独运行[运行库文件抽取]

背景

用vs2019 c++开发软件,发行版本需要运行库,因为别的电脑不一定安装运行库,所以要特别处理

方案

  1. 编译的exe,c++运行库设置MT(静态模式),代码集成在你的exe中
    1. 导致exe变大
    2. 其他第三方库可能冲突【可能第三方库需要改变编译模式】,常见冲突在这里
    3. 存在多份运行库代码,增大安装包体积
    4. 简单
  2. 需要动态库DLL 放在exe执行目录
    1. 需要复制多个DLL,所以要知道依赖哪些库
  3. 安装运行库
    1. 增加安装包体积
    2. 安装运行库万一冲突,还可能失败【对于阉割系统,太多麻烦的事情】
    3. 增加安装时间

      选择

      主流方案都选择第二种

      常见需要复制文件,打开vs2019,然后跳出任务管理器,找到对应进程,然后打开所在的目录


目录跳到IDE这一层

进行搜索
vcruntime140.dll
msvcp140.dll
ucrtbase.dll
api-ms-win-crt-conio-l1-1-0.dll 打开这个位置所有api-全部复制出来,懒得一个一个找。

基本大部分项目足够,如果软件还报错,他会提示,你自己慢慢复制就可以了,其他的版本vs也是这么慢慢查找。

备注

一定要放在exe同级目录,因为window搜索动态目录是这样子(非系统DLL优先级是当前目录最大)。
vs2019 多了好多api,貌似2015以后微软优化运行库,我看了一下文档,没有看出什么特别的地方,现在只记得它进行优化。。。

vs 运行库知识点

一、问题

  • 我们编译c/c++的执行程序(exe),如果运行库没有选择静态编译(mt),那么可能在别的电脑上就无法运行(因为没有对应的运行库)
  • 程序选择mt静态遍历,我们链接别的第三库会出现链接报错

上面是我们用c/c++编译经常遇到问题。

二、运行具体文件的作用[vs2019为例子]

  • vcruntime140: c语言运行库,比喻我们用到prinf
  • msvcp140.dll c++ 运行库 ,比喻我们用到的 std::cout
  • 其他补充,以前的版本不一定有,有可能是win10才有

140 代表是运行库的版本号,你用的vs版本不一样,这里数字不一样。

三、解释

1:问题1解决办法

  • exe 运行库选择mt,这个在vs 工程选项 c/c++ 运行库进行设置
  • 安装包写脚本自动检测,安装对应的运行库程序【用的不少,但国内版本比较多,不一定能安装成功】
  • 自己直接在exe运行库放 所有运行库,直接从vs 目录找到对应的版本运行库就可以了【这种比较多】

2:问题2解决办法

如果你exe选择静态遍历,第三方库选择md 动态编译,链接时候会发现运行库的代码已经实现,出现冲突,相当于定义出现2次了,导致无法链接。【凭记忆写的,改天自己用一个第三方库验证一下】

第三方库也选择静态编译就不会冲突了,但实际中非常麻烦,这个c/c++ 非常不方便地方,跟现在高级语言比起来麻烦很多,导致新手门槛太高。我自己都不怎么用c/c++写一些工具,用别的高级语言,直接几行命令就可以继承第三方的库直接开始工作,c/c++还需要单独编译,单独编译还不一定能成功。

四、总结

本篇文章只是为了记录一下,因为前段时间正好思考这个问题,到底他们运行库怎么搞的,为什么会编译出错等等。有些问题不思考,不验证还真不知道具体原因,只知道那样子操作就可以,但具体为什么却不知道

visual studio 运行库 mt md

我们经常运行软件的时候提示运行库缺失,导致程序运行不了,这个时候我们就要下载对应的运行库,这个运行就是c语言的运行库,提示缺失是因为我们编译程序的选择md ,C语言的运行库用的dll。那么必须系统带有运行库,否则运行失败,这样子我们采用2种做法,一种采用mt 静态编译,那么c语言库就在程序里面,要么我们自己把运行库直接放在程序里面,这样子也能正常运行。当初用动态编译是为了减少程序大小,感觉带了运行库,跟静态编译差别不打,如果小程序还是建议静态编译。