代码之家  ›  专栏  ›  技术社区  ›  Collin Dauphinee

解决多重crt问题

  •  3
  • Collin Dauphinee  · 技术社区  · 16 年前

    我知道有一些类似的问题,但我不认为他们真的有相同的要求,我的。

    我们的dll是用visual studio 2005编译的,并且 必须 由于安装限制,链接到特定版本的CRT。这是绝对的,用最新版本重新编译它不是一个解决方案。

    我们最近更新了boost库。然而,当我构建boost时,它会自动使用最新的crt。现在,当我将boost与我们的程序链接时,它会创建对crt的最新(错误)版本和旧(正确)版本的依赖关系。对最新版本的依赖性需要消除。

    这个问题最好的解决办法是什么?目前,我能想到的最好的办法是使用旧版本重新构建boost,但是我不知道如何在不修改源代码的情况下轻松地做到这一点。

    如果有办法强制visual studio全局使用crt的特定版本(不是基于每个项目),那就太好了。或者只是简单地删除最新版本的crt,但我很确定这是不可能的,因为我认为它被视为操作系统的一部分。

    3 回复  |  直到 16 年前
        1
  •  5
  •   Ganesh R.    16 年前

    不过,不建议使用不同版本的CRT。与.NET不同,在.NET中可以从.NET 2.0 dll引用.NET 1.1 dll,非托管不提供这种灵活性。

    由于无法将dll升级为使用较新的crt,因此只能在vs2005中重建boost。

    此外,不建议连接不同CRT的两个DLL。它会导致诸如内存损坏之类的问题。

    注意:每个visual studio都有其默认的crt版本,所有dll都引用该版本。

    我也不明白“去掉新的阴极射线管”。您需要为使用的每个版本的visual studio安装visualstudio redist。(redist包含crt dll) http://msdn.microsoft.com/en-us/library/abx4dbyh%28VS.80%29.aspx

        2
  •  3
  •   Collin Dauphinee    16 年前

    解决方案是手动修改嵌入的清单以消除对最新crt的依赖,因为它是用动态链接的crt构建的。不过,我对这件事的安全性表示怀疑。

    出于某种原因,在boost构建过程中强制包含targetsxs文件并没有强制它以指定的crt为目标。

        3
  •  0
  •   sharptooth    16 年前

    您必须准确地找到boost项目中的哪个构造将依赖注入到错误的crt并删除/修改该构造。它可能是.vcproj文件中的某个东西,或者某个清单之类的东西。

    VC++2005和VC++2008 CRT包含或多或少相同的原语-您可能完全可以用VC++2005重新编译Boost,或者稍微调整一下,然后再重新编译。是的,这需要一些努力,但这是唯一的方法-您的代码和boost代码都必须根据您想要使用的crt版本进行编译。