11

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

我怎样才能做到这一点?

4

1 回答 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因此,分发您知道肯定适用于您的应用程序的版本始终是一个好主意。

于 2013-04-07T17:54:39.867 回答