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

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

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

Так что мой единственный вариант - собрать с помощью MinGW, но по-прежнему ссылаться на msvcr110.dll.

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


person Raman Sharma    schedule 04.04.2013    source источник
comment
нужно, чтобы кто-то собрал libmsvcr110.a ...   -  person Sheng Jiang 蒋晟    schedule 05.04.2013
comment
Я еще не знал, но кое-что в этом роде я слышал и от других людей. Я скоро попробую и доложу.   -  person Raman Sharma    schedule 18.04.2013


Ответы (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, поставляемого "из коробки" (и для этого есть веские причины). Тем не менее, как обычно, никто не мешает вам построить его самостоятельно. Для этого вам сначала нужно получить _ 6_, а затем используйте (сладкое) 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, которая, как вы знаете, работает с вашим приложением.

person Alexander Shukaev    schedule 07.04.2013
comment
Есть одна проблема с вашим ответом: libmoldname110.a не входит в сборки MinGW-w64 - person Ignitor; 17.05.2013
comment
@Ignitor: Вы случайно не знаете, нужно ли вам создавать эту библиотеку самостоятельно или она не включена, потому что в ней нет необходимости? - person Joe; 16.07.2015
comment
Это необходимо, и я не знаю, как собрать эту библиотеку. : - / - person Ignitor; 16.07.2015
comment
Отличный ответ, но, к сожалению, libmoldname110.a не входит в состав MinGW-w64. Вы знаете, как это построить? - person 2501; 01.02.2016
comment
@ 2501, если это все еще актуально, см. Обновленный ответ. Пожалуйста, дайте мне знать, работает у вас это или нет. Если не получится, то будем копать дальше. - person Alexander Shukaev; 01.02.2016
comment
@Joe, если это все еще актуально, см. Обновленный ответ. Пожалуйста, дайте мне знать, работает у вас это или нет. Если не получится, то будем копать дальше. - person Alexander Shukaev; 01.02.2016
comment
@Ignitor, если это все еще актуально, см. Обновленный ответ. Пожалуйста, дайте мне знать, работает у вас это или нет. Если не получится, то будем копать дальше. - person Alexander Shukaev; 01.02.2016
comment
Он создает файл libmoldname110.a и компилирует test.c, но при его запуске происходит сбой и выдается: Приложению не удалось запустить, потому что его параллельная конфигурация правильная. Пожалуйста, просмотрите журнал событий приложения или воспользуйтесь средством командной строки sxstrace.e xe для получения дополнительных сведений. (у меня в папке есть msvcr110.dll). - person 2501; 02.02.2016
comment
@ 2501, проверьте полученный исполняемый файл с помощью Dependency Walker, просмотрев все его зависимостей и убедитесь, что все они 32-битные (если сам исполняемый файл 32-битный) или 64-битный (если сам исполняемый файл 64-битный). Мне просто любопытно, может ли это быть проблемой с некоторыми флагами компиляции. - person Alexander Shukaev; 02.02.2016
comment
Я так думаю. В дереве зависимостей MSVCR110.DLL почти пуста по сравнению с версией с MSVCRT.DLL. (Я не очень знаком с этим.) - person 2501; 02.02.2016
comment
Эй, ты случайно не исследовал это? - person 2501; 02.02.2016
comment
Извините, у меня сейчас очень мало времени из-за большого графика работы. Я постараюсь найти время, чтобы разобраться в этом. Хотя я бы также порекомендовал вам изучить это тоже, поскольку это то, что вам, похоже, нужно в первую очередь. Не волнуйтесь, если вначале вы не поймете многого. Понимание инструментов, принципов и базовой инфраструктуры компилятора, которое вы получите в конце, будет бесценным. То есть вы уже заметили, что в любом случае не многие люди обладают глубокими знаниями в этой области, что делает их важным навыком в определенных ситуациях. - person Alexander Shukaev; 03.02.2016
comment
Кстати, я также настоятельно рекомендую постучать по списку рассылки MinGW-w64 по этому поводу. Эти люди здесь мастера, и если мы получим от них хорошие ответы, мы могли бы составить здесь хорошее руководство. - person Alexander Shukaev; 03.02.2016