win10下vs2015编译的程序如何运行在win7等系统(无需安装Redistributable)

最近新写的程序要做beta测试,在做绿色版(免安装版)时遇到了问题,vs2015做的项目本以为像之前的vs版本一样把msvcrXXX.dll还有另外几个运行时库都放到exe旁边即可,然并卵。。。,在win7的测试机上还会提示找不到这个dll:api-ms-win-crt-runtime-l1-1-0.dll,如下图

继续找到这个dll拷到exe旁,坑爹的一幕放生了,竟然提示那个dll有问题——无法定位程序输入点ucrtbase.terminate。。。

难道是版本不对,我机器上是有几个不同大小的api-ms-win-crt-runtime-l1-1-0.dll,都试了下,还是不行,这就没处说理了。。。然后谷歌了下,都是说要装vs2015 Redistributable或者KB2999226的更新(Win10通用CRT,不是win10的,是其他win7等系统的更新用来支持通用crt的程序),试着装了下Redistributable包竟然装到一半报未定义的错误(0x80240017)。。。O(≧口≦)O,而且这也背离了绿色版的初衷,继续研究吧。

后来注意到api-ms-win-crt-runtime-l1-1-0.dll同目录下有一堆api-xxx的dll,可能都是有联系的,索性整个目录所有dll全都拷到exe旁了,竟然可以启动了 O(∩_∩)O

注意:我用的是win10 sdk中的dll,具体目录在C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x86  ,不同机器目录可能略有不同。另外我的程序是32位,所以是x86文件夹的,如果是64位等可以用Windows Kits\10\Redist\ucrt\DLLs下的对应文件夹的dll

仔细一看拷过去的dll中还有一个叫ucrtbase.dll,难道和入口点那个报错有关系,删了后确实又报第二个截图的错误了。。。好坑爹呀,为什么别人都是报丢失dll,就你是报找不到入口点呢(而且还是另一个已存在的dll),害得我纠结了这么久,不管怎么样终于找到制作vs2015程序绿色版的正确姿势了——除了以往的msvc运行时库的多个dll外,还要把win10通用crt相关的多个dll都放到exe旁才可以。

后记:用procexp又看了下绿色版程序在win10机器上加载dll的列表,竟然没有api-xxx那堆dll,一个都没有,看来那些dll确实只是用于其他系统运行win10通用crt程序的,win10本身因为做了原生支持所以就不需要加载那些dll了。

时间: 2024-11-14 14:57:39

win10下vs2015编译的程序如何运行在win7等系统(无需安装Redistributable)的相关文章

Win10下vs2015编译OSGEarth2.10

一.OSG编译 1. 源码或预编译库下载 OSG版本3.6.3:CMake版本3.12.1-x64:Geos版本:3.7.1:GDAL版本:2.3.1:数据包由官网下载:官网上还提供其他vs2015环境下OSG编译依赖的第三方库所用的CMake编译脚本,其地址为https://github.com/bjornblissing/osg-3rdparty-cmake同时该页面提供由AppVeyor所预编译好的vs2015和vs2017的库文件下载. 2. 文件目录 D:\OSG\OpenSceneG

win10下vs2015配置Opencv3.1.0过程详解(转)

下载安装Opencv3.1.0 下载Opencv3.1.0,进入官网,点击opencv for windows即可下载.  点击运行下载好的文件.实际上,opencv的安装程序就是解压缩文件,个人因为只有C盘,所以就直接在C盘建了一个文件夹Opencv3.1.0.  选好路径之后点击Extract即可. OpenCV3.1.0环境变量配置 选择此电脑(计算机),右键属性->高级系统设置->环境变量->系统变量->找到Path->在变量值中添加相应路径,我的路径是 C:\Ope

win10下vs2015配置Opencv3.1.0过程详解

下载安装Opencv3.1.0 下载Opencv3.1.0,进入官网,点击opencv for windows即可下载.  点击运行下载好的文件.实际上,opencv的安装程序就是解压缩文件,个人因为只有C盘,所以就直接在C盘建了一个文件夹Opencv3.1.0.  选好路径之后点击Extract即可. OpenCV3.1.0环境变量配置 选择此电脑(计算机),右键属性->高级系统设置->环境变量->系统变量->找到Path->在变量值中添加相应路径,我的路径是 C:\Ope

在linux下如何编译C++程序

一.GCC(GNU Compiler Collection)是linux下最主要的编译工具,GCC不仅功能非常强大,结构也异常灵活.它可以通过不同的前端模块来支持各种语言,如Java.Fortran.Pascal.Modula-3和Ada g++是GCC中的一个工具,专门来编译C++语言的. GCC的参数有:( 也是分步实现) -E  让GCC在预处理结束后停止编译  g++ -E hello.cpp  -o  hello.i -c  将hello.i编译成目标代码 g++  -c  hello

[转]VS2015编译的程序在其他机器上缺少msvcp120.dll

http://www.lai18.com/content/1159618.html 1. 今天分享一个自己在开发过程中遇到的困难. 用VS2015开发了一个windows客户端(win32项目),在自己的机器上运行很流畅.当你得意的把releas版本进行打包,并进行发布后,问题来了?很多人反馈运行时缺少msvcp140.dll,甚至有人在XP系统上完全不能用. 那么首先看看是如何解决的: 在工程上打开属性,选择C/C++,选择代码生成,把运行库改为"多线程(/MT)".重新编译即可.

Linux下静态编译Qt程序

一般情况下,我们用Qt编译出来的程序是要依赖于系统Qt库的,也就是这个程序移到别的没有安装Qt库的系统上是不能使用的.会提示缺少……库文件之类的错误.这就是动态编译的结果. 但是如果我们想编译一个程序,这个程序在发给别人后,他们可以直接打开,而不需要特别地去先安装Qt库,那就需要采用静态编译了. 在Linux下如何静态编译Qt程序呢? 首先需要先安装静态编译的Qt,也就是静态编译Qt程序首先是需要一个静态编译安装的Qt   1.下载源安装程序,如 qt-x11-opensource-src-4.

Linux下优雅的让程序后台运行

假设在终端上启动运行了一个程序,跑了几天,如果不小心把terminal关了,那么程序就会终止,这是SIGHUP信号的原因,即使通过bg置为后台运行同样会如此,应该让程序成为一个daemon,步骤如下: 1.Ctrl+z 暂停程序的运行,可以看到程序的作业号,假设为1: 2.bg %1 置为后台运行: 3. disown -h %1 使其不受终端关闭的影响. => The disown command on ksh shell causes the shell not to send a HUP

windows下vs2015编译BOOST

编译caffe动态链接库,在vs下引用时缺少boost的相关运行库,dependency下也没有找到,于是自己本机编译boost库: step1 打开vs命令行工具 在启动菜单下找到vs的文件夹,有一个VS2015 X64 本机工具命令提示符,运行bootstrap.bat,得到b2.exe,bjam.exe. step2. 修改project-config.jam import option ; using msvc : 14.0 : "C:\Program Files (x86)\Micro

win10下cmake 编译tensorflow1.11.0

硬件环境: win10 + GPU 1060 6G 软件环境:cmake 3.14.2 + swigwin-3.0.12 + Anaconda 3.5 + pycharm 2017.2.3 + vs2015 ----开始---(参考url: https://blog.csdn.net/yz2zcx/article/details/83106669) 1 git tensorflow r1.11.0 源码 2 打开cmake 3.14.2, 选择源码路径和编译路径,点击Configure 3 会出