日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

MinGW 使用 msvcr90.dll

發布時間:2025/3/15 c/c++ 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MinGW 使用 msvcr90.dll 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
MinGW 編譯出來的程序總是使用 VC6 的 msvcrt.dll ,VC8,9,10有很多新的API(僅限于c runtime),想使用怎么辦? 比如:boost 對 MinGW 最低要求就是 msvcrt 7.0 ?

1.MinGW 系統默認情況

MinGW 根據宏 MSVCRT_VERSION 來選擇 msvcr 版本,如果用戶未指定則默認使用 VC7 的 API(bug, MinGW 默認鏈接的是 msvcrt.dll, 雖然與 msvcr70.dll 差別不是太大) ? MinGW 4.8?(w32api-4.0.3-1) 中有如下定義,根據目標操作系統的版本來確定運行時(鏈接時候依然需要手動指定特定版本 msvcrt) 文件 /MinGW/include/_mingw.h /** We need to set a default MSVCRT_VERSION which describes the MSVCRT.DLL on* the users system. We are defaulting to XP but we recommend the user define* this in his config.h or Makefile file based on the minimum supported version* of OS for his program.* ME = 600* XP = 710* VISTA = 800* WIN7 = 900* WIN8 = 1010*/ #ifndef MSVCRT_VERSION #if _WIN32_WINNT >= _WIN32_WINNT_WIN8 #define MSVCRT_VERSION 1010 #elif _WIN32_WINNT >= _WIN32_WINNT_WIN7 #define MSVCRT_VERSION 900 #elif _WIN32_WINNT >= _WIN32_WINNT_VISTA #define MSVCRT_VERSION 800 #elif _WIN32_WINNT >= _WIN32_WINNT_WINXP #define MSVCRT_VERSION 710 #elif _WIN32_WINNT >= _WIN32_WINNT_WIN2K #define MSVCRT_VERSION 700 #elif _WIN32_WINNT >= _WIN32_WINNT_WINME #define MSVCRT_VERSION 600 #else #define MSVCRT_VERSION 700 #endif /* _WIN32_WINNT >= _WIN32_WINNT_WINME */ #endif /* ndef MSVCRT_VERSION */

?

MinGW 4.7 及之前是通過宏 ?__MSVCRT_VERSION__?來選擇?msvcr 的版本的。

2. MinGW 使用高版本 VC runtime

編輯 spec 文件(參考?http://www.mingw.org/wiki/HOWTO_Use_the_GCC_specs_file) 生成默認的 GCC spec 文件 gcc -dumpspecs > <mingw-root>/lib/gcc/mingw32/<gcc-version>/specs 修改 specs 文件中的 ?cpp 和 libgcc (標紅部分) *cpp: -DMSVCRT_VERSION=0x0710?%{posix:-D_POSIX_SOURCE} %{mthreads:-D_MT} %{pthread:-D_REENTRANT} %{!no-pthread: }? ? *libgcc: %{mthreads:-lmingwthrd} -lmingw32 %{shared-libgcc:-lgcc_s} %{!shared-libgcc:-lgcc_eh} -lgcc?-lmoldname71?-lmingwex?-lmsvcr71 注意:此方法只能支持從 msvcrt.dll 改為 msvcr70.dll 或者 msvcr71.dll 鏈接更高版本的 msvcr 動態庫時候,如 msvcr90.dll,會提示無法定位 _findfirst 于 msvcr90.dll 上。 此問題的原因在于:MinGW 在鏈接階段會鏈接 libmingwex.a 庫,而此庫是以 VC6 為環境編譯的,其依賴 msvcrt.dll。 所以也需要以 VC8,9,10 的環境編譯多份 mingwex ——這里可以取巧僅以 VC8 為環境編譯一個版本即可,因為 VC8 相比 VC71 API 改變很多,但跟后續的 VC9,10 差別不大。

3. 重新編譯 libmingwex.a

下載?http://iweb.dl.sourceforge.net/project/mingw/MinGW/Base/w32api/w32api-4.0.3/w32api-4.0.3-1-mingw32-src.tar.lzma 并解壓; 修改 w32api-4.0.3-1.mingw32-src/Makefine.in 指定 VC 運行時的版本(這里指定 vc8 ,同時附帶將操作系統版本最低要求改為xp) ALL_CFLAGS=$(CFLAGS) $(INCLUDES)?-DNTDDI_VERSION=0x05010000 -DMSVCRT_VERSION=800

MinGW win32api?4.0.3-1 的頭文件中關于 findfirst findnext 的定義不正確,需要修改替換 wchar.h 和 io.h,點此下載

然后重新編譯 ./configure make 將編譯后的 ligmingex.a 拷貝至 MinGW/lib 目錄,記得加個后綴,這里依賴 vc8 所以改名為 libmingex80.a 。 修改 spec 文件,將 -lmingwex 改為上面的新文件。 *libgcc: %{mthreads:-lmingwthrd} -lmingw32 %{shared-libgcc:-lgcc_s} %{!shared-libgcc:-lgcc_eh} -lgcc?-lmoldname80?-lmingwex80?-lmsvcr80 然后隨便編譯一個文件,運行程序則會報如下問題,找不到 msvcr90.dll? 強制拷貝一個 msvcr90.dll 到程序目錄,但運行時候則報 R6034 的問題,見下圖 對此問題,在生成的目標 exe 目錄下手動創建一個 manifest 文件即可解決。 文件名:?程序名.后綴.manifest 內容(version 需要根據你系統的 msvcr 版本修改): <?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' /> <!-- VC2008 新增,程序是否需要以管理員運行 --> </requestedPrivileges> </security> </trustInfo> <dependency> <dependentAssembly> <assemblyIdentity type='win32' name='Microsoft.VC90.CRT'?version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' /> </dependentAssembly> </dependency> </assembly> 備注:網上有說想鏈接高版本 msvcr,只需編譯時候 不鏈接任何 MinGW 的標準庫,只鏈接 msvcr 和 gcc (細節見http://stackoverflow.com/questions/3402252/how-to-link-against-msvcr90-dll-with-mingw-gcc),但實際結果如下: $ gcc a.c?-nostdlib?-lmsvcr80?-lgcc d:/msys/mingw/bin/../lib/gcc/mingw32/4.8.1/libgcc.a(__main.o):(.text+0x5a): undefined reference to `atexit' collect2.exe: error: ld returned 1 exit status

4. 嵌入manifest

1.? 發布程序時為了簡單,可以用 mt.exe (VC中的工具) 嵌入manifest 對于exe mt.exe –manifest MyApp.exe.manifest -outputresource:MyApp.exe;1 對于dll mt.exe –manifest MyLibrary.dll.manifest -outputresource:MyLibrary.dll;2 2. 每次編譯都得手動拷貝一個 manifest,確實非常煩人,這里使用更方便的方法。將manifest文件編譯為資源,然后讓MinGW鏈接 創建文件 msvcr.rc #include "winuser.h" CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST msvcrt.manifest

?

創建 msvcrt.manifest ,內容同前面的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' /></requestedPrivileges></security></trustInfo><dependency><dependentAssembly><assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' /></dependentAssembly></dependency> </assembly>

?

使用 MinGW 的 windres 將前面的 manifest 編譯為資源 windres --input msvcr.rc --output msvcr90_manifest.o 將生成的 msvcr90_manifest.o 放到 MinGW 的 lib 目錄, 修改 MinGW 的 spec 文件,startfile 部分增加 *startfile: %{shared|mdll:dllcrt2%O%s} %{!shared:%{!mdll:crt2%O%s}} %{pg:gcrt2%O%s} crtbegin.o%s?msvcr90_manifest.o%s

轉載于:https://www.cnblogs.com/JesseFang/p/3991832.html

總結

以上是生活随笔為你收集整理的MinGW 使用 msvcr90.dll的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲激情一区 | 东方成人av | 欧美综合色区 | 林雅儿欧洲留学恋爱日记在线 | 亚洲精品一级 | 国产极品一区 | 伊人成人在线观看 | 五月深爱婷婷 | 99久久精品免费看国产 | 一级在线免费观看 | 免费三级网站 | 日本三级精品 | 自拍偷拍国产视频 | 午夜国产免费 | 在线一级视频 | 国产区av| 日本打白嫩屁股视频 | 青青草欧美 | 波多野42部无码喷潮在线 | 超碰97观看 | 2019最新中文字幕 | 国产成人短视频 | 国产中文字幕在线免费观看 | 国产经典一区二区 | 日韩欧美一卡 | 国产精品99久久久久久一二区 | 亚洲妇女av| 亚洲av无一区二区三区 | 欧美整片在线观看 | 国产精品专区在线观看 | 成人午夜久久 | 九九热精品视频在线 | 国产三级av片 | 一区二区在线观看视频 | 熟女熟妇伦久久影院毛片一区二区 | 男人资源网站 | 午夜色播 | 丁香久久婷婷 | 人人爱人人澡 | 720url在线观看免费版 | 日本不卡高清视频 | 91好色先生tv | 亚洲视频久久 | 久久女同互慰一区二区三区 | 免费看a级片| 美女露出让男生揉的视频 | 日韩精品黄 | 欧美岛国国产 | 日韩精品久久一区二区 | 国产精品99久久久久久久女警 | 一女三黑人理论片在线 | 日本www在线 | 日韩一级色片 | 中文字幕一区二区免费 | 黄色污在线观看 | 一区二区三区四区免费 | 少妇的性事hd | 午夜在线精品 | 色噜噜噜 | 国产精品有限公司 | 污污小说在线观看 | 精品国产乱码久久久久久蜜臀 | 亚洲人午夜射精精品日韩 | 欧美福利在线视频 | 成人在线免费小视频 | 亚洲色图在线观看 | 久久伊人久久 | 国产一级一区二区 | 精品黄色av | 国产免费91视频 | 国偷自产av一区二区三区 | 国模无码视频一区二区三区 | 人妻精品久久久久中文 | 成人午夜视频在线免费观看 | 亚洲国产精品免费在线观看 | 农村老女人av | 成人性生交大片免费看中文 | 国产日本在线播放 | 色噜噜狠狠一区二区三区 | 黑人爱爱视频 | 久久亚洲av无码西西人体 | 狠狠狠狠狠狠狠干 | 动漫3d精品一区二区三区乱码 | 国产淫片av片久久久久久 | 综合色av | 亚洲国产免费av | 超碰2019 | 无码一区二区三区在线 | 美利坚合众国av | 午夜影视免费 | juliaann欧美二区三区 | 乱精品一区字幕二区 | 黄色视屏软件 | 欧美激情黑人 | 亚洲成人诱惑 | 熟妇高潮喷沈阳45熟妇高潮喷 | 精品免费在线观看 | 成人爽站w47pw | 亚洲人成无码网站久久99热国产 |