11

I am trying to build a DLL using MinGW for Windows. I know that by default building using MinGW introduces a dependency on msvcrt.dll that ships with Windows. However, I want my DLL not to have a dependency on msvcrt.dll. Instead I want my DLL's C Runtime dependency to be satisfied using the msvcr110.dll (the Visual Studio 2012 CRT).

The reason why I need to do this is because the source code I am trying to build uses some C99 features that are not available in the VC11 compiler so it has to be built using MinGW. At the same time a DLL having a dependency on msvcrt.dll is disallowed in a Windows 8 Store application (which is what I am trying to build). Instead if a DLL has a dependency on msvcr110.dll, it is allowed in Windows Store.

So my only option is to build using MinGW but still link to msvcr110.dll.

How can I achieve this?

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 ランタイムはほとんどのプラットフォームに含まれていますが、さまざまなバージョンがあり、バグがあったり、下位互換性が失われているものもあります。msvcr*.dllしたがって、アプリケーションで確実に動作することがわかっているのバージョンを配布することを常にお勧めします。

于 2013-04-07T17:54:39.867 に答える