- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试使用适用于 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/
如果您有以下项目结构: -Shared - Exe_Proj1 - Exe_Proj2 CRT的使用方式有以下几种: -Shared (Dynamic CRT /MD) - Exe_Proj
我已禁用 CRT,但我希望使用一些运行时函数,如 strtok、strcmpy、strcpy 等,但我不希望整个 CRT 运行,有人可以告诉我如何在不运行的情况下使用这些函数CRT 并启用所有 CRT
我正在练习使用 CRT 库查找内存泄漏。我写了一些这样的代码: #define _CRTDBG_MAP_ALLOC #include #include #include typedef stru
考虑到 LTCG(链接时间代码生成或整个程序优化)的潜在性能改进,这需要 .obj 文件的可用性,Microsoft 是否为其 MSVCRT 版本的各种版本提供 .obj 文件?人们会认为这是获得一些
我正在尝试从Raspberry Pi Pico Running CircuitPython上的天气API中获取数据。它在此接口上工作。代码:。错误:
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
我发现了这个相关问题: Running SSL node.js server with godaddy gd_bundle.crt 其中概述了拆分证书的过程,但使用了三个属性:证书、CA 和 key
我正在尝试使用适用于 Windows 的 MinGW 构建 DLL。我知道默认情况下使用 MinGW 构建会引入对 Windows 附带的 msvcrt.dll 的依赖。但是,我希望我的 DLL 不依
Windows 应用程序动态链接 CRT。在应用程序执行其部分代码后,它加载共享库。共享库与 CRT 静态链接。 我的问题是: 如果应用程序对“CRT 状态”做了一些更改(例如在某些文件中重新打开标准
我知道它们用于调用 main(),但如果那是唯一目的,那么拥有不同的 crt 文件有什么意义。为什么不使用默认的而不是创建自己的? 最佳答案 CRT 文件是 C 运行时文件。您最有可能遇到的是 crt
我是JMeter的新手。我相信我已经成功安装了它,并且正在运行脚本记录器设置(http://jmeter.apache.org/usermanual/jmeter_proxy_step_by_step
我有下面的代码,我认为它基于 Finding Memory Leaks Using the CRT Library , 应该打印出内存泄漏的行号。 #include "stdafx.h" #defin
以下代码在 VS2012 中按预期工作,调试版本: #include #include #include #include #include #include DWORD WINAPI c
这是我的函数,它应该找到第一个遇到的具有给定名称的进程并返回它的句柄。然而在这个过程中我需要在堆上分配一些数据,当我尝试删除时会抛出错误。 HANDLE GetProcessHandleByName(
我遇到了很多内存泄漏的问题。 CRT 在以下代码中显示泄漏例如: char *cmd = new char[128]; 我该怎么办? char *cmd = new char[128]; delete
讨论应用程序错误: 很少有大多数应用程序线程卡在相同重复的死锁上。在 Windows XP 和更高版本上,死锁大约每月重现一次。 我们大型项目的基本要素: 当错误在客户机器上重现时,项目构建为发布目标
char* SequenceTokenAnalizer::NextToken(char delim){ int main() { SequenceTokenAnalizer st1("This is
我遇到了问题,我的应用程序存在无限增长的内存泄漏,但未检测到。我所做的非常简单,就是创建一个对象,在其上运行一个方法,然后删除该对象。每次执行此操作时,TaskManager 中的内存使用量都会增加大
根据 Security Enhancements in the CRT和 Secure Template Overloads ,可以使用 _CRT_SECURE_NO_WARNINGS 禁用与因安全问
在编写 C++ 应用程序时,我通常会限制自己使用 C++ 特定的语言功能。这主要意味着尽可能使用 STL 而不是 CRT。 对我来说,STL 比使用 CRT 更流畅且更易于维护。请考虑以下事项: st
我是一名优秀的程序员,十分优秀!