[CMake] InstallRequiredSystemLibraries.cmake and Redistribution of the shared C runtime component in Visual C++

Mike Jackson mike.jackson at bluequartz.net
Thu Aug 20 19:27:09 EDT 2009


OK. Turns out it was ITK being compiled in Debug mode and then trying
to link against it with a Release build.

On to some comments that might help others:

VCExpress 2008 SP1 does NOT come with VCRedist_x86.exe. You will need
to download the correct version.
VCExpress 2008:
<http://www.microsoft.com/downloads/details.aspx?FamilyID=D5692CE4-ADAD-4000-ABFE-64628A267EF0&displaylang=en>

VCExpress 2008 SP1:
<http://www.microsoft.com/downloads/details.aspx?familyid=A5C84275-3B97-4AB7-A40D-3802B2AF5FC2&displaylang=en>

Double and Triple check that all your projects and sub projects have
all been compiled the same way (Debug vs Release) and all with the
same settings for the c/c++ runtime libraries.

In order to re-use Clinton's code I had to create a few directories:
C:\Program Files\Microsoft Visual Studio
9.0\SDK\v3.5\BootStrapper\Packages\vcredist_x86

needs to be created (so that it matches the VS2005 paths).

Next I created a Macro:

macro(_FIND_MSVC_REDIST VCVERS)
  message(STATUS "Looking for MSVC Redistributable Executable for MSVC
Version ${VCVERS}")
  set(SDKVERS "2.0")
  if(${VCVERS} EQUAL 8)
    set(SDKVERS "2.0")
  endif()
  if(${VCVERS} EQUAL 9)
    set(SDKVERS "3.5")
  endif()
  IF(MSVC${VCVERS}0)
    FIND_PROGRAM(MSVC_REDIST NAMES
vcredist_${CMAKE_MSVC_ARCH}/vcredist_${CMAKE_MSVC_ARCH}.exe
      PATHS
      "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VCExpress\\${VCVERS}.0;InstallDir]/../../SDK/v${SDKVERS}/BootStrapper/Packages/"
      "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\${VCVERS}.0;InstallDir]/../../SDK/v${SDKVERS}/BootStrapper/Packages/"
      "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\VisualStudio\\${VCVERS}.0;InstallDir]/../../SDK/v${SDKVERS}/BootStrapper/Packages/"
      )
    GET_FILENAME_COMPONENT(vcredist_name "${MSVC_REDIST}" NAME)
    INSTALL(PROGRAMS ${MSVC_REDIST} COMPONENT SupportFiles DESTINATION bin)
    SET(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "ExecWait
'\\\"$INSTDIR\\\\bin\\\\${vcredist_name}\\\"'")
    message(STATUS "MSVC_REDIST: ${MSVC_REDIST}")
  ENDIF(MSVC${VCVERS}0)
endmacro()


The have the following:

if(MSVC80)
_FIND_MSVC_REDIST(8)
endif()

if(MSVC90)
_FIND_MSVC_REDIST(9)
endif()

I would like to add sometime in the future the correct command to run
the vcredist silently during the installation.

I think that is all. I would also like to thank everyone here for
their patience with me today. Also like to put in a word to the
VirtualBox guys at Sun. The make really nice FREE virtual machine
which allowed the quick testing of the installer on a "Clean" Windows
XP SP3 install. Thanks

_________________________________________________________
Mike Jackson                  mike.jackson at bluequartz.net

On Thu, Aug 20, 2009 at 7:05 PM, Mike
Jackson<mike.jackson at bluequartz.net> wrote:
> Yep. First thing I have tried, and have been using all day. I think I
> may have tracked part of the problem down to a few things.
>
> 1: vcredist_x86.exe - There are multiple versions of this (all with
> the same file name). You have to make sure you download the correct
> version. I have VCExpress 2008 SP1. I was downloading the one for
> VCExpress 2008.
>
> 2: I think I have ITK built as Debug and I am trying a "Release" build
> of my main application suite. We all know that Debug and Release
> builds in Windows-Land do not get along.
>
> Boost may be another unknown (bjam.. yeech..). Far as I know I told
> bjam to use a dynamically linked c runtime.
>
> Expat, HDF5, Tiff all are built as static libraries using CMake so the
> default there is to use a dynamic linked c runtime. So I think those
> libraries are OK.
>
> My own intermediate library (MXADataModel) is also built as a static
> library and using CMake. So should be the same as Expat, HDF5 and Tif
> from above.
>
> Does not seem to be a redistributable package for the Debug versions
> of the C/C++ runtime libs. Bummer.
>
> Qt 4.5.1 is built as DLL's so I am hoping that will not hinder me as
> everything else is built as Static libraries (to try and avoid DLL
> hell .. )
>
> ITK is currently rebuilding which will take another hour or so. I'll
> report back when that is complete maybe with some good
> _________________________________________________________
> Mike Jackson                  mike.jackson at bluequartz.net
>
> On Thu, Aug 20, 2009 at 6:57 PM, j s<j.s4403 at gmail.com> wrote:
>> Did you try the dependency walker (available via google) to see if there may
>> be any dll's you need to have in the same directory as the binary?
>>
>> Regards,
>>
>> Juan
>>
>> On Thu, Aug 20, 2009 at 5:03 PM, Mike Jackson <mike.jackson at bluequartz.net>
>> wrote:
>>>
>>> So I "created" the proper paths within the VCExpress installation and
>>> placed the downloaded vcredist_x86.exe file in there. CMake found it.
>>> NSIS found it and included it. I ran my new installer on a "clean" XP
>>> SP3 machine. Verified the vcredist.exe actually ran also. Tried to
>>> launch an application and I still get an error that says the
>>> application is not configured correctly.
>>>
>>> Still lost and Confused.
>>>
>>> Mike
>>>
>>> On Thu, Aug 20, 2009 at 5:40 PM, j s<j.s4403 at gmail.com> wrote:
>>> > I don't believe that to be the case with Visual Express 2008.  I don't
>>> > know
>>> > how previous editions work.
>>> >
>>> > Can I use Express Editions for commercial use?
>>> >
>>> > Yes, there are no licensing restrictions for applications built using
>>> > Visual
>>> > Studio Express Editions.
>>> >
>>> > http://www.microsoft.com/express/support/faq/
>>> >
>>> > Juan
>>> >
>>> >
>>> >
>>> > On Thu, Aug 20, 2009 at 4:33 PM, David Cole <david.cole at kitware.com>
>>> > wrote:
>>> >>
>>> >> Hold on there...
>>> >> The Express editions are not meant to build redistributable binaries.
>>> >> They're meant for personal use: i.e. -- each user compiles his own
>>> >> code. I'm
>>> >> pretty sure it's a violation of the Express edition license agreement
>>> >> to
>>> >> build binaries for other people. You need at least the "Standard"
>>> >> edition of
>>> >> VS to get that capability.
>>> >>
>>> >>
>>> >> HTH,
>>> >> David
>>> >>
>>> >> On Thu, Aug 20, 2009 at 5:11 PM, Mike Jackson
>>> >> <mike.jackson at bluequartz.net> wrote:
>>> >>>
>>> >>> On Thu, Aug 20, 2009 at 4:06 PM, James Bigler<jamesbigler at gmail.com>
>>> >>> wrote:
>>> >>> > On Thu, Aug 20, 2009 at 1:51 PM, Mike Jackson
>>> >>> > <mike.jackson at bluequartz.net>
>>> >>> > wrote:
>>> >>> >>
>>> >>> >> On Thu, Aug 6, 2009 at 3:12 PM, Marcus D. Hanwell<marcus at cryos.org>
>>> >>> >> wrote:
>>> >>> >> > James Bigler wrote:
>>> >>> >> >> On Thu, Aug 6, 2009 at 12:10 PM, Bill Hoffman
>>> >>> >> >> <bill.hoffman at kitware.com <mailto:bill.hoffman at kitware.com>>
>>> >>> >> >> wrote:
>>> >>> >> >>
>>> >>> >> >>     James Bigler wrote:
>>> >>> >> >>
>>> >>> >> >>
>>> >>> >> >>         Well, I was using VS 2005 64 bit with SP 1.  I wonder if
>>> >>> >> >> there
>>> >>> >> >>         is a similar bug or if there is something else going
>>> >>> >> >> wrong
>>> >>> >> >>         such as what Marcus Hanwall described.
>>> >>> >> >>
>>> >>> >> >>
>>> >>> >> >>     I am not sure what your issue is, but I know I have done
>>> >>> >> >> this
>>> >>> >> >> many
>>> >>> >> >>     times...
>>> >>> >> >>
>>> >>> >> >>     -Bill
>>> >>> >> >>
>>> >>> >> >>
>>> >>> >> >> I checked the version numbers of the DLLs, and even checked the
>>> >>> >> >> md5sum
>>> >>> >> >> and everything was the same between the dlls in the WinSxS
>>> >>> >> >> folder
>>> >>> >> >> and
>>> >>> >> >> the ones I'm distributing.  It failed on two clean systems
>>> >>> >> >> without
>>> >>> >> >> the
>>> >>> >> >> vcredist install.  I guess I'll run vcredist as Microsoft
>>> >>> >> >> suggests
>>> >>> >> >> and
>>> >>> >> >> see if I can trouble shoot later.
>>> >>> >> >>
>>> >>> >> >> It is a rather perplexing problem.
>>> >>> >> >>
>>> >>> >> > The link Bill supplied has all of the relevant information. In
>>> >>> >> > the
>>> >>> >> > "Community Discussion" section the second comment provides three
>>> >>> >> > possible workarounds. We are using the third of those when
>>> >>> >> > distributing
>>> >>> >> > Avogadro packages for Windows. The version mismatch in the
>>> >>> >> > manifests
>>> >>> >> > of
>>> >>> >> > the compiled executables and the manifest with the
>>> >>> >> > redistributable
>>> >>> >> > DLLs
>>> >>> >> > is what causes the issue.
>>> >>> >> >
>>> >>> >> > It seems that MS has no intention of fixing this issue. We have a
>>> >>> >> > clean
>>> >>> >> > VM where we test new installers, as occasionally this change was
>>> >>> >> > lost
>>> >>> >> > and the DLLs failed to load.
>>> >>> >> >
>>> >>> >> > Marcus
>>> >>> >>
>>> >>> >> Ok, so I too have run into this problem. What is anyone doing to
>>> >>> >> get
>>> >>> >> around this issue?
>>> >>> >>
>>> >>> >> I would really like a solution that did NOT involve editing
>>> >>> >> anything
>>> >>> >> from VC++ install as I would have to pass those instructions on to
>>> >>> >> the
>>> >>> >> next Developer. Clinton's posting about including the VCRedist.exe
>>> >>> >> in
>>> >>> >> the NSIS installer is OK by me. Is that what everyone else is
>>> >>> >> doing?
>>> >>> >>
>>> >>> >> Thanks
>>> >>> >> --
>>> >>> >> Mike Jackson
>>> >>> >
>>> >>> > I ended up linking against the static CRT library (/MT), but that's
>>> >>> > not
>>> >>> > for
>>> >>> > everyone.
>>> >>> > http://msdn.microsoft.com/en-us/library/ms235460.aspx
>>> >>> >
>>> >>> > My next choice was going to be including the VCRedist.exe in the
>>> >>> > installer.
>>> >>> > For some of the other projects at my company, this is what they do.
>>> >>> >
>>> >>> > Here are some links I've been consulting on the subject of CRT
>>> >>> > library
>>> >>> > (conflicts with multiple CRTs).
>>> >>> >
>>> >>> >
>>> >>> > http://stackoverflow.com/questions/1075050/howto-multiple-versions-of-msvcrt9-as-private-sxs-assemblies
>>> >>> >
>>> >>> >
>>> >>> > http://tedwvc.wordpress.com/2009/08/10/avoiding-problems-with-vc2005-sp1-security-update-kb971090/
>>> >>> >
>>> >>> >
>>> >>> > http://stackoverflow.com/questions/1265792/visual-studio-2005-security-updates-and-crt-dll-versions-in-manifest
>>> >>> >
>>> >>> > James
>>> >>> >
>>> >>>
>>> >>> thanks for the links. Now my head is really spinning. I have VC2008
>>> >>> Express installed on WinXP SP3 and evidently the vcredist.exe is NOT
>>> >>> included with that version? At least I can not find it.  So I guess I
>>> >>> have to download it from MSDN (duh) and then manually set all the
>>> >>> paths and all that in oder to have cmake/NSIS find and include it in
>>> >>> the installer. And I thought deploying on OS X was a bit obtuse...
>>> >>>
>>> >>> Mike
>>> >>> _______________________________________________
>>> _______________________________________________
>>> Powered by www.kitware.com
>>>
>>> Visit other Kitware open-source projects at
>>> http://www.kitware.com/opensource/opensource.html
>>>
>>> Please keep messages on-topic and check the CMake FAQ at:
>>> http://www.cmake.org/Wiki/CMake_FAQ
>>>
>>> Follow this link to subscribe/unsubscribe:
>>> http://www.cmake.org/mailman/listinfo/cmake
>>
>>
>


More information about the CMake mailing list