Visual studio 2015 run-time dependencies or how to get rid of Universal CRT?

前端 未结 5 1025
悲哀的现实
悲哀的现实 2020-11-30 03:29

Compiled couple of .dll\'s using visual studio 2015, and tried to deploy on some older windows 7 / 64 bit. Tried also to guess which dll\'s are needed for application to sta

5条回答
  •  被撕碎了的回忆
    2020-11-30 03:36

    (Updated 11.10.2016).

    It's possible to get rid of universal CRT by linking it statically, I'll get to it later on, but let's take a look if you continue to use universal CRT as such.

    According to article https://blogs.msdn.microsoft.com/vcblog/2015/03/03/introducing-the-universal-crt/ - it's possible to launch your application using universal crt dll distributables from following folder: C:\Program Files (x86)\Windows Kits\10\Redist\ucrt

    There are 41 files totally in list with 1.8 Mb size in total. (example for 64-bit platform)

    Of course it's not enough, you will need additionally vcruntime140.dll & msvcp140.dll coming from following folder: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\redist\x64\Microsoft.VC140.CRT

    So after that you will ship totally 43 additional dll's besides your application.

    It's also possible to statically compile ucrt library inside your application after which you will not need 43 dll's - but whether static link will for after linking or not - depends on your application - how many dll's and which api's are in use. Generally after ucrt gets linked into two different dll's they don't necessarily share same globals with each other - which can results in errors.

    You need to link against vcruntime.lib / msvcrt.lib, but it's not sufficient - there are extra _VCRTIMP= and _ACRTIMP= defines which needs to be disabled from pulling functions from ucrt.

    If you're using premake5 you can configure your project like this:

    defines { "_VCRTIMP="}
    linkoptions { "/nodefaultlib:vcruntime.lib" }
    links { "libvcruntime.lib" }
    

    followed by:

    defines { "_ACRTIMP="}
    linkoptions { "/nodefaultlib:msvcrt.lib" }
    links { "libcmt.lib" }
    

    Defines are not documented by Microsoft - so it's possible that it's subject to change in future.

    Besides your own projects, you will need to re-compile all static libraries which are in use in your projects.

    As for boost libraries - I've managed to compile boost as well, using b2.exe boostrapper

    boost>call b2 threading=multi toolset=msvc-14.0 address-model=64 --stagedir=release_64bit --build-dir=intermediate_64but release link=static,shared --with-atomic --with-thread --with-date_time --with-filesystem define=_VCRTIMP= define=_ACRTIMP=

    When troubleshooting linking problems - notice that unresolved __imp* function names from because of dllimport keyword usage - and if you link against libvcruntime.lib, you should not have any __imp* references.

提交回复
热议问题