Использование MinGW для создания DLL Windows, которое зависит от CRT Visual Studio (msvcr110.dll) НЕ на Windows CRT (msvcrt.dll)

Я пытаюсь создать DLL, используя MinGW для Windows. Я знаю, что по умолчанию создание с использованием MinGW вводит зависимость от msvcrt.dll, которая поставляется с Windows. Тем не менее, я хочу, чтобы моя DLL не зависела от msvcrt.dll. Вместо этого я хочу, чтобы моя зависимость времени выполнения DLL C удовлетворялась с помощью msvcr110.dll(CRT Visual Studio 2012).

Причина, по которой мне нужно сделать это, заключается в том, что в исходном коде, который я пытаюсь создать, используются некоторые функции C99, которые недоступны в компиляторе VC11, поэтому его нужно создать с помощью MinGW. В то же время DLL, зависящая от msvcrt.dll, запрещена в приложении Windows 8 Store (это то, что я пытаюсь создать). Вместо этого, если DLL имеет зависимость от msvcr110.dll, это разрешено в Windows Store.

Поэтому мой единственный вариант - создать с помощью MinGW, но все же ссылку на msvcr110.dll.

Как я могу это достичь?

Ответ 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

Примечание:
К сожалению, на данный момент у меня нет возможности проверить это точно. Поэтому, пожалуйста, сообщите свой опыт в комментариях, чтобы мы могли совместно придумать окончательное решение.

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, которая, как вы знаете, работает с вашим приложением.