gpt4 book ai didi

c - 使用 MinGW 构建依赖于 Visual Studio CRT (msvcr110.dll) 而非 Windows CRT (msvcrt.dll) 的 Windows DLL

转载 作者:太空狗 更新时间:2023-10-29 16:44:50 30 4
gpt4 key购买 nike

我正在尝试使用适用于 Windows 的 MinGW 构建 DLL。我知道默认情况下使用 MinGW 构建会引入对 Windows 附带的 msvcrt.dll 的依赖。但是,我希望我的 DLL 不依赖于 msvcrt.dll。相反,我希望使用 msvcr110.dll(Visual Studio 2012 CRT)来满足我的 DLL 的 C 运行时依赖性。

我需要这样做的原因是因为我试图构建的源代码使用了一些 VC11 编译器中不可用的 C99 功能,因此必须使用 MinGW 构建它。同时,在 Windows 8 应用商店应用程序(这是我正在尝试构建的应用程序)中不允许依赖于 msvcrt.dll 的 DLL。相反,如果 DLL 依赖于 msvcr110.dll,则在 Windows 应用商店中是允许的。

所以我唯一的选择是使用 MinGW 构建但仍然链接到 msvcr110.dll。

我怎样才能做到这一点?

最佳答案

我鼓励您下载并安装最新的 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>

Application Manifests 了解更多信息。

构建


$ 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 的版本总是一个好主意。您所知道的肯定适用于您的应用程序。

关于c - 使用 MinGW 构建依赖于 Visual Studio CRT (msvcr110.dll) 而非 Windows CRT (msvcrt.dll) 的 Windows DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15822048/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com