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

Ram*_*rma 11 c mingw msvcrt visual-c++ visual-studio-2012

我正在尝试使用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.

我怎样才能做到这一点?

Ale*_*aev 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

注意:
不幸的是,目前,我没有机会完全自己测试.因此,请在评论中报告您的经验,以便我们共同提出最终解决方案.

test.rc


#include <winuser.h>

// Choose:
1 RT_MANIFEST msvcr110.manifest // if linking executable
2 RT_MANIFEST msvcr110.manifest // if linking DLL
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

查看Application Manifest以获取更多信息.

建立


$ windres -i test.rc -o test.rc.o --output-format=coff
$ gcc -specs=specs.msvcr110 -o test test.c test.rc.o
Run Code Online (Sandbox Code Playgroud)

建议


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

  • 你的答案有一个问题:'libmoldname110.a`不包含在MinGW-w64版本中 (2认同)