如何获得所需的MSVC运行时库的位置(How to get location of needed r

2019-08-03 05:33发布

我有定制的包装在CMake的,其中进行配置,编译和创造各种平台(win32的,在SunOS等)和不同的编译器DISTRIB。 我需要投入DISTRIB所有需要的运行时库(libgcc_s.so,的libstdc ++。因此对于* nix中像OS。MSVCR90.DLL,msvcp100.dll为Win32)。 例如,GCC有机制,它允许让这些库的全名:

# get location of libgcc_s of default compiler
bash-3.2$ g++ -print-file-name=libgcc_s.so
/usr/local/lib/gcc/sparc-sun-solaris2.10/3.4.6/../../../libgcc_s.so

# get location of libstdc++ of custom compiler
bash-3.2$ g++-4.5.3 -print-file-name=libstdc++.so
/u/gccbuild/installed/gcc-4.5.3/lib/gcc/sparc-sun-solaris2.10/4.5.3/../../../libstdc++.so

所以,我需要MSVC(2008,2010)类似的机制,这可能吗? (它可以是给定的编译环境变量或注册表值,否则水木清华)。 或者,也许有一些CMake的机制来获得这些信息。

Answer 1:

您可以使用InstallRequiredSystemLibraries cmake的模块。 对于CMake的,这将在MSVC的DLL(和舱单)添加到您的cmake安装目标。

作为替代方案,你可以写一个检查安装Visual Studio版本的注册表,并找到vcredist自己的小cmake的代码。 然后,您可以在vcredist包添加到自己的分销和“滑流”,其在自己的安装程序安装。

例如,像下面这样将搜索vcredist_2010,并把它添加到NSIS安装:

if(CMAKE_CL_64)
     set(CMAKE_MSVC_ARCH amd64)
   else(CMAKE_CL_64)
     set(CMAKE_MSVC_ARCH x86)
endif(CMAKE_CL_64)

# Try and find the vcredist_XX.exe, normally this is in the WindowsSDK folder.
if( MSVC10 )
    find_program(MSVC_REDIST NAMES VC/vcredist_${CMAKE_MSVC_ARCH}.exe
        PATHS
        "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\v7.1;InstallationFolder]/Redist/"               
        )
        get_filename_component(vcredist_name "${MSVC_REDIST}" NAME)
endif( MSVC10 )

# If we found a vcredist-package, we add it simply to the 
# installation-folder and run it with NSis.
if( vcredist_name )
    message( STATUS "    Adding " ${vcredist_name} " to Install" )
    install(PROGRAMS ${MSVC_REDIST} COMPONENT System DESTINATION bin)
    # Add /q to make the vcredist install silent
    set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "ExecWait '\\\"$INSTDIR\\\\bin\\\\${vcredist_name}\\\" /q'" )
endif( vcredist_name )


文章来源: How to get location of needed runtime libraries for msvc