使用MinGW构建依赖于Visual Studio CRT(msvcr110.dll)而不是Windows CRT(msvcrt.dll)的Windows DLL

11
我正在尝试使用MinGW为Windows构建DLL。默认情况下,使用MinGW进行构建会引入对Windows附带的msvcrt.dll的依赖性。但是,我不希望我的DLL依赖于msvcrt.dll,而是想通过msvcr110.dll(Visual Studio 2012 CRT)来满足我的DLL的C运行时依赖关系。
我需要这样做的原因是因为我正在尝试构建的源代码使用了一些C99特性,在VC11编译器中不可用,因此必须使用MinGW进行构建。同时,具有对msvcrt.dll的依赖性的DLL在Windows 8商店应用程序中被禁止(这就是我正在尝试构建的内容)。相反,如果DLL具有对msvcr110.dll的依赖性,则在Windows Store中是被允许的。
所以我的唯一选择是使用MinGW进行构建,但仍然将其链接到msvcr110.dll。
我该如何实现这一点?

1
需要有人构建一个libmsvcr110.a... - Sheng Jiang 蒋晟
我还没有,但是我也听到其他人这样说过。我很快会尝试并回报结果。 - Raman Sharma
1个回答

9
我建议您下载并安装最新的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

注意:
很遗憾,目前我没有机会亲自测试这个。因此,请在评论中报告您的经验,以便我们共同提出最终解决方案。

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>

请查看应用程序清单以获取更多信息。

构建


$ 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,但其中有许多不同版本,其中一些版本存在漏洞和/或破坏向后兼容性的问题。因此,最好分发你确定能与应用程序完全兼容的msvcr*.dll版本。

2
您的回答有一个问题:libmoldname110.a 在 MinGW-w64 构建中没有被包括。 - Ignitor
1
@Ignitor:你知不知道你是否需要自己构建那个库,还是说它没有被包含进来因为它不是必要的? - Joe
1
这是必要的,但我不知道如何构建该库。 :-/ - Ignitor
@Joe,如果这仍然相关,请查看更新的答案。请告诉我它是否适用于您。如果不是,则我们将进一步挖掘。 - Alexander Shukaev
它生成了文件libmoldname110.a,并且编译了test.c,但运行时崩溃并显示:应用程序无法启动,因为其并行配置不正确。请查看应用程序事件日志或使用命令行sxstrace.exe工具获取更多详细信息。(我在文件夹中有msvcr110.dll。) - 2501
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接