minGW cygWin 交叉編譯總結

主要有兩類方法:

1、minGW cygWin等模擬了linux相關係統庫對應windows中的實現,可以無需改動代碼,但其中CygWin編譯生成的程序要運行於windows還需額外的動態鏈接庫cygwin1.dll等,效率上有些區別,而MinGW通過靜態鏈接可以直接生成windows下運行的二進制文件。CygWin相當於通過動態鏈接模擬了Windows下的Linux運行環境,更徹底,更全面,而MinGW改動了GCC等編譯工具以使之符合Windows平臺,故而運行庫是MSVCR等windows原生鏈接庫。而mingw通常配合使用的msys則是模擬了linux的命令行。

2、直接在vs新建工程,用宏定義將所有平臺相關的代碼進行條件編譯,也可以用宏定義將某個平臺的函數替換成另一個平臺的函數,以此使代碼更簡潔

More Detailed Introduction:

CygWin:  【Highlights of Cygwin Functionality】 Highlights of Cygwin Functionality

MinGW:  【 About Installation Settingshttps://www.cnblogs.com/ggg-327931457/p/9694516.html

MinGW & MinGW-W64 【 MinGW & MinGW-W64  】https://www.cnblogs.com/foohack/p/3877276.html

MinGW & MinGW-W64 & MYSYS .etc  https://bitbucket.org/FrankHB/yslib/src/50c3e6344a5a24b2382ce3398065f2197c2bd57e/doc/Workflow.Annual2014.txt?at=master&fileviewer=file-view-default

MinGW是個什麼GHOST】 https://blog.csdn.net/lee_ham/article/details/81778581?utm_source=blogxgwz5

 

首先 MingW 和 Cygwin 都不能讓 Linux 下的程序直接運行在 Windows 上,必需通過源代碼重新編譯。現代操作系統包括 Windows 和 Linux 的基本設計概念像進程線程地址空間虛擬內存這些都是大同小異的,之所以二者上的程序不能兼容,主要是它們對這些功能具體實現上的差異,首先是可執行文件的格式,Window 使用 PE 的格式,並且要求以 .EXE 爲後綴名。Linux 則使用 Elf。其次操作系統的 API 也不一樣,如 Windows 用 CreateProcess() 創建進程,而 Linux 使用 fork()。所以要移植程序必然要在這些地方進行改變,MingW 有專門的 W32api 頭文件,來把代碼中 Linux 方式的系統調用替換爲對應的 Windows 方式。而 Cygwin 則通過 cygwin1.dll 這個文件來實現這種 API 的轉換,並模擬一個 Linux 系統調用接口給程序,程序依然以 Linux 的方式調用系統 API,只不過這個 API 在 cygwin1.dll 上,cygwin1.dll 再調用 Windows 對應的實現,來把結果返回給程序。可以用查看他們編譯好的程序的導入表來驗證這點。二者生成的程序都是能在 Windows 上運行的 EXE 文件,顯然都是 PE 格式,用一個PE格式查看工具檢查一下就能發現,Cygwin 生成的程序依然有 fork() 這樣的 Linux 系統調用,但目標庫是 cygwin1。而 MingW 生成的程序,則全部使用從 KERNEL32 導出的標準 Windows 系統 API。

這樣看來用 MingW 編譯的程序性能會高一點,而且也不用帶着那個接近兩兆的 cygwin1.dll 文件。

 

MinGW,是Minimalist GNUfor Windows的縮寫。它是一個可自由使用和自由發佈的Windows特定頭文件和使用GNU工具集導入庫的集合,允許你在GNU/Linux和Windows平臺生成本地的Windows程序而不需要第三方C運行時(C Runtime)庫。MinGW 是一組包含文件和端口庫,其功能是允許控制檯模式的程序使用微軟的標準C運行時(C Runtime)庫(MSVCRT.DLL),該庫在所有的 NT OS 上有效,在所有的 Windows 95發行版以上的 Windows OS 有效,使用基本運行時,你可以使用 GCC 寫控制檯模式的符合美國標準化組織(ANSI)程序,可以使用微軟提供的 C 運行時(C Runtime)擴展,與基本運行時相結合,就可以有充分的權利既使用 CRT(C Runtime)又使用 WindowsAPI功能。

 

區別:http://www.cnblogs.com/flyinggod/p/8048224.html  MinGW是一套Windows環境下GNU編譯組件的接口,通俗的可以說是Win上的gcc 。比起MinGW,也許那隻企鵝CygWin更加著名一些,實現的效果也差不多,但事實上兩者的原理是不同的。Cygwin通過一箇中間層的動態鏈接庫來實現Win API和Cygwin的連接,好處是應用在Linux與Win之間移植更加方便,風格更加一致,缺點是發佈應用時一定要帶上Cygwin的環境動態庫,應用執行效率也略微有點低;MinGW則使用靜態鏈接的方式,生成的應用更加本地化,不需要依賴任何第三方的C/C++ RT動態鏈接庫,僅依賴Win自身的運行環境,應用執行效率也稍高。當然現在這兩家也開始有了一些功能的互補,總而言之可以相互作爲替代品使用。

 

MSYS的全稱叫Minimal SYStem,是MinGW的一個子系統,是一套運行在Windows上的bash,也就是運行在Win上的Linux Terminal [1]。這個比較好理解,其實就是在Win上使用Linux的命令行進行操作,可以代替cmd來使用。對一些GNU的開源軟件,MSYS可能是必需的,因爲它們通常需要./configure然後make才能運行(學Linux的童鞋應該非常熟悉這個流程了)[2]。我們將MSYS和MinGW配合使用就可以打造出一個Win下的GNU命令行終端和編譯系統。

要注意的問題:

跨平臺的文本編碼問題,linux和windows下換行符的不同,最好用UTF8編碼,\r\n的換行方式進行統一

About Predefined MACRO:

C/C++跨平臺的預編譯宏【C/C++跨平臺的的預編譯宏】  https://blog.csdn.net/earbao/article/details/53307432

error C1071: 在註釋中遇到意外的文件結束

該問題的可能原因有編碼不兼容、正文中包含中文註釋且註釋採用/**/ 方式標註(改成//可解決該問題),括號未正確關閉, 類定義後缺少分號等。

 error: 'mutex' in namespace 'std' does not name a type:

 error: 'mutex' is not a member of 'std':

安裝MinGW 的時候要選擇posix 線程模型以支持C++11 thread: threads-posix發行版將使用 posix API並允許使用 std:: thread,threads-win32將使用 win32api,並禁用標準的std::thread 部分,

【 mingw-w64線程模型:posix vs win32(posix允許使用c++11的std:: thread,但要帶一個winpthreads,可能需要額外dll) 】

https://stackoverflow.com/questions/17242516/mingw-w64-threads-posix-vs-win32

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章