【问题标题】:Using MinGW to build a Windows DLL that depends on Visual Studio CRT (msvcr110.dll) NOT on Windows CRT (msvcrt.dll)使用 MinGW 构建依赖于 Visual Studio CRT (msvcr110.dll) 而非 Windows CRT (msvcrt.dll) 的 Windows DLL
【发布时间】:2013-03-27 04:00:53
【问题描述】:

我正在尝试使用 MinGW for Windows 构建一个 DLL。我知道默认情况下,使用 MinGW 构建会引入对 Windows 附带的 msvcrt.dll 的依赖。但是,我希望我的 DLL 不依赖于 msvcrt.dll。相反,我希望使用 msvcr110.dll(Visual Studio 2012 CRT)来满足我的 DLL 的 C 运行时依赖项。

我需要这样做的原因是因为我尝试构建的源代码使用了一些在 VC11 编译器中不可用的 C99 功能,因此必须使用 MinGW 构建它。同时,在 Windows 8 Store 应用程序(这是我正在尝试构建的)中不允许使用依赖于 msvcrt.dll 的 DLL。相反,如果 DLL 依赖于 msvcr110.dll,则在 Windows 应用商店中是允许的。

所以我唯一的选择是使用 MinGW 构建,但仍链接到 msvcr110.dll。

我怎样才能做到这一点?

【问题讨论】:

  • 需要有人来构建一个 libmsvcr110.a ...
  • 我还没有,但我也从其他人那里听到过类似的情况。我会尽快尝试并报告。

标签: c visual-c++ visual-studio-2012 mingw msvcrt


【解决方案1】:

我鼓励您下载并安装最新的 MinGW-w64,不仅因为它是最先进的,而且它还包含要链接的导入库 libmsvcr110.a。然后尝试以下操作:

specs.msvcr110


%rename cpp msvcrXX_cpp

%rename cc1plus msvcrXX_cc1plus

*cpp:
%(msvcrXX_cpp) -D__MSVCRT_VERSION__=0x1100 -D__USE_MINGW_ACCESS

*cc1plus:
%(msvcrXX_cc1plus) -D__MSVCRT_VERSION__=0x1100 -D__USE_MINGW_ACCESS

*libgcc:
%{mthreads:-lmingwthrd} -lmingw32 %{shared-libgcc:-lgcc_s} -lgcc -lmoldname110 -lmingwex -lmsvcr110

libmoldname110.a


正如你们中的一些人正确地注意到的那样,确实没有提供开箱即用的libmoldname110.a(这有充分的理由)。然而,像往常一样,没有人阻止你自己建造一个。为此,您首先需要获取<mingw-w64-source-dir>/mingw-w64-crt/lib64/moldname-msvcrt.def,然后使用(甜蜜的)dlltool,如下所示:

$ dlltool -k -U --as=as --def=moldname-msvcrt.def --dllname=msvcr110.dll --output-lib=libmoldname110.a

注意:
不幸的是,目前,我没有机会亲自测试这一点。因此,请报告您在 cmets 方面的经验,以便我们共同提出最终解决方案。

test.rc


#include <winuser.h>

// Choose:
1 RT_MANIFEST msvcr110.manifest // if linking executable
2 RT_MANIFEST msvcr110.manifest // if linking DLL

msvcr110.manifest


<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC110.CRT" version="11.0.51106.1" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b">
        <file name="msvcr110.dll" />
        <file name="msvcp110.dll" />
        <file name="msvcm110.dll" />
      </assemblyIdentity>
    </dependentAssembly>
  </dependency>
</assembly>

查看Application Manifests了解更多信息。

构建


$ windres -i test.rc -o test.rc.o --output-format=coff
$ gcc -specs=specs.msvcr110 -o test test.c test.rc.o

推荐


虽然 Microsoft Visual C Runtime 包含在大多数平台上,但它有许多不同的版本,其中一些是 buggy 或/和 破坏向后兼容性。因此,分发您知道肯定适用于您的应用程序的msvcr*.dll 版本始终是一个好主意。

【讨论】:

  • 您的回答存在一个问题:libmoldname110.a 不包含在 MinGW-w64 构建中
  • @Ignitor:您不会碰巧知道是否必须自己构建该库,或者是否因为没有必要而没有包含它?
  • 这是必要的,我不知道如何构建该库。 :-/
  • 很好的答案,但不幸的是 libmoldname110.a 不包含在 MinGW-w64 中。你知道如何构建它吗?
  • @2501,如果这仍然相关,请参阅更新的答案。请让我知道它是否适合您。如果没有,那么我们将进一步挖掘。
猜你喜欢
  • 1970-01-01
  • 2011-05-07
  • 2012-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多