如何获取 msvc 所需的运行时库的位置

2023-12-25

我有 CMake 的自定义包装器,它为各种平台(win32、SunOS 等)和不同的编译器执行配置、编译和创建发行版。我需要将所有需要的运行时库放入 distrib 中(*nix 的 libgcc_s.so、libstdc++.so,如 OS.msvcr90.dll、win32 的 msvcp100.dll)。例如,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 机制可以获取此类信息。


你可以使用InstallRequiredSystemLibraries cmake-module。 http://www.cmake.org/cmake/help/v2.8.10/cmake.html#module%3aInstallRequiredSystemLibraries对于 CMake,它将把 msvc dll(和清单)添加到您的 cmake-install 目标中。

作为替代方案,您可以编写自己的小 cmake 代码,该代码检查注册表中已安装的 Visual Studio 版本并查找 vcredist.txt 文件。然后,您可以将 vcredist 包添加到您自己的发行版中,并在您自己的安装程序中“slipstream”安装。

例如。类似以下内容将搜索 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 )
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何获取 msvc 所需的运行时库的位置 的相关文章

随机推荐

  • 使用 API 通过 Nodejs 使用 Drive.files.copy 将 Word 文档转换为 Google 文档 在 Google Drive API v3 中进行转换

    我正在尝试通过 Node js 使用 API 将 Word 文档转换为 Google 文档 单词文档已经在一个文件夹中 我只想将它们转换为谷歌文档 我正在使用v3 The v3 docs https developers google co
  • PHP EOF 仅显示循环的一个结果

    我在 PHP 中使用 EOF 问题是它只显示来自 mySQL 循环的一项 它仅显示最后的结果 这在EOF中有必要吗 或者我可以避免这个问题吗 Thanks function getYiBAdminBanner global site glo
  • R try catch 块

    我正在尝试在循环中评估树的多个输出参数 但有时树功能会中止 这些行如何被 try catch 块包围 我很抱歉没有 真正的 代码 但我没有非工作树的示例 这是pseddo代码来说明当前的实现 for icol in seq 1 ncol c
  • 如何从纬度和经度找出地图瓦片坐标?

    我正在使用 Mapbox 矢量切片从后端进程收集特定数据 在示例中 他们提供了曼哈顿图块的链接 http a tiles mapbox com v3 examples map zr0njcqy 14 4823 6160 png http a
  • 如何在管道中使用导管下降功能?

    我有一个简单的任务 从文件中读取一堆行并对每一行执行一些操作 除了第一个 这是一些需要忽略的标题 所以我想我应该尝试一下管道 printFile src runResourceT CB sourceFile src CT decode CT
  • 有没有办法获得 dask 中每组最大的项目?

    我有以下数据集 location category percent A 5 100 0 B 3 100 0 C 2 50 0 4 13 0 D 2 75 0 3 59 0 4 13 0 5 4 0 我正在尝试获取数据框中按位置分组的最大类别
  • 使用别名覆盖内置命令

    我正在尝试创建一个覆盖的别名cd命令 这将在 真实 之前和之后执行一个脚本cd 这是我到目前为止所拥有的 alias cd echo before cd 1 echo after 这将执行echo before and echo after
  • 识别通过蓝牙与 PixelSense 配对的移动设备

    我希望能够通过蓝牙将 Microsoft PixelSense 硬件与多个移动设备配对 并且我希望 PixelSense 知道哪个设备是哪个 因此 如果我将两部手机放在桌子上 PixelSense 应该能够通过设备名称来标记它们 我最初的想
  • html 模板保存在哪里?

    我有一个单页应用程序 目前我的模板存储在index html中 例如 以这种方式存储它们是最佳实践吗 我发现了jQuery 模板 我应该把它们放在哪里 https stackoverflow com questions 4719828 jq
  • Redis 作为独特的原子 ID 生成器 - Web 应用程序避免竞争条件的线程安全方式

    我计划使用 Redis 作为唯一的原子 id 生成器 但是 我担心多个浏览器可能会同时发出 Web 请求 我想知道 使以下操作原子化的常见做法是什么 get id from redis if id is not found insert i
  • 如何从环境变量将动态主题名称传递给@KafkaListener(topics)

    我正在写一个卡夫卡消费者 我需要将环境变量主题名称传递给 KafkaListener topics 这是我到目前为止所尝试过的 import org springframework beans factory annotation Auto
  • 使用 itextsharp 根据大小将 pdf 拆分为更小的 pdf

    因此 我们有一些非常低效的代码 可以根据允许的最大大小将 pdf 分成更小的块 又名 如果最大大小为 10megs 则将跳过 8 meg 文件 而将根据页数拆分 16 meg 文件 这是我继承的代码 我觉得必须有一种更有效的方法来做到这一点
  • numpy 中的数组切片

    今天我使用numpy数组进行一些计算 发现一个奇怪的问题 例如 假设我已经在Ipython中导入了numpy arange 并且我运行了一些脚本 如下所示 In 5 foo arange 10 In 8 foo1 foo arange 3
  • 如何通过 AJAX POST 将“数据”发送到 ASMX Web 服务?

    我可以成功地从我的网络服务接收值 因此在这方面脚本工作正常 不过 我现在尝试使用下面的 数据 字段将数据发送到网络服务 我不知道如何将一个简单的字符串 例如 test 发送到网络服务 这是我的网络方法期望的参数 任何帮助深表感谢 例如 fu
  • 将表单传递给服务层与原始输入

    验证表单并将其过滤后的输入传递到服务层更好 还是将原始输入传递到服务层并让服务验证输入 有或没有表单实例 更好 显然 如果是后者 控制器仍然需要访问表单 以便将其发送到视图进行渲染 如果是这样 您是否只需通过服务 service gt ge
  • bytesWritten,但其他设备从未收到 NSStreamEventHasBytesAvailable 事件

    我已经在 iPhone 和 Mac 之间建立了 Bonjour 网络 用户在 Mac 中显示的表格中选择 iPhone 的网络服务 并在两侧创建并打开一对流 iPhone 首先向 Mac 发送一个代码 整数 Mac成功接收 用户输入和处理暂
  • 将 _redirects 文件添加到 Netlify 上托管的 Vue SPA 的根路径

    我正在使用 Vue CLI 开发一个单页应用程序 并希望历史推送状态能够工作 以便获得干净的 URL 我必须遵循这个 https www netlify com docs redirects history pushstate and si
  • 类型错误:“str”不支持缓冲区接口

    我从我的原始代码发布 crystal open vmises dat r crystalincrement pickle load crystal crystaldir pickle load crystal crystalface pic
  • 将非数字替换为空字符串

    在我们的项目中快速添加需求 我们的数据库中保存电话号码的字段设置为仅允许 10 个字符 那么 如果我通过 913 444 5555 或其他任何内容 是否有一种快速方法可以通过某种特殊的替换函数运行字符串 我可以向它传递一组允许的字符 Reg
  • 如何获取 msvc 所需的运行时库的位置

    我有 CMake 的自定义包装器 它为各种平台 win32 SunOS 等 和不同的编译器执行配置 编译和创建发行版 我需要将所有需要的运行时库放入 distrib 中 nix 的 libgcc s so libstdc so 如 OS m