C/C++ 代碼是不可跨平臺的,Windows 和 Unix-like 有著不同的 API,C/C++ 在不同平臺有著不同編譯器。
MSVC
Windows 平臺,MSVC 是 Visual Studio 中自帶的 C/C++ 編譯器。
GCC
Unix-like 平臺,GCC 原名 GNU C Compiler,后來逐漸支持更多的語言編譯(C++、Fortran、Pascal、Objective-C、Java、Ada、Go等),所以變成了 GNU Compiler Collection(GNU 編譯器套裝),是一套由 GNU 工程開發的支持多種編程語言的編譯器。不過隨著時間推移,由于各種原因,GCC 除核心語言 C/C++ 之外語言的編譯器要么不再維護,要么支持的規范有限(例如 GCC 中的 Java 編譯器 gcj 已被廢棄,主流使用 JDK 中的 javac,其他非核心語言編譯器處境大同小異),故實質上 GCC 目前核心就是 gcc 和 g++。
如何從Unix-like系統向Windows系統移植軟件?
現代操作系統包括Windows和Linux的基本設計概念,像進程線程地址空間虛擬內存這些都大同小異,二者之上的程序之所以不兼容,主要是它們對這些功能具體實現上的差異:
首先,是可執行文件的格式,Window使用PE的格式,并且要求以.EXE為后綴名,Linux則使用Elf。
其次,操作系統API也同,比如,Windows用CreateProcess()創建進程,而Unix-like系統則使用fork(),其他還有很多諸如spawn、signals、select、sockets等。
分析之后可知,要把Unix-like系統上的軟件移植到Windows上,有幾種思路:
第一種:修改軟件源碼并重新編譯,這個方法最笨,類Unix下大量的軟件要修改工作量很大,編譯生成目標平臺可執行文件格式。
第二種:不修改軟件源碼但把類Unix接口調用悄悄替換為WinAPI,還是需要重新編譯,編譯生成目標平臺可執行文件格式。
第三種,無縫移植的運行環境,無需重新編譯,在一種OS上建立另一中OS的應用軟件虛擬環境(和虛擬機不一樣),比如Wine(把Windows上的可執行程序直接原樣移植到Linux上)。
Cygwin 和 MingW(Minimalist GNU for Windows) 均是對 第二種 方案的實現。
第二種方案有兩個問題要解決:
- 把類Unix接口調用悄悄替換為WinAPI
- 在 Windows 平臺下將 Unix-like 平臺代碼編譯為 Windows 下可執行文件
Cygwin和MingW均是對 GCC 進行的封裝
GCC 具有交叉編譯能力,可以解決第二個問題,Cygwin和MingW均對 GCC 進行封裝,由 GCC 編譯 Unix-like 代碼得到 Windows 平臺下的 PE 格式可執行文件。
Cygwin和MingW各自的工作主要是解決第一個問題,兩者采用了不同思路。
Cygwin和MingW都是第二種軟件移植思路,當然,二者還是有區別,區別就在于“替換”方式,Cygwin編譯時,程序依然以Linux的方式調用系統API,只不過把Unix-like接口link到自己的cygwin1.dll上,然后在cygwin1.dll中重新調用Windows API,cygwin1.dll再調用Windows對應的實現,來把結果返回給程序。也就是說,他們基于Win32 API中寫了一個Unix系統API的重定向層,所以用它移植的軟件都依賴于cygwin1.dll,MingW編譯時通過特有的WinAPI頭文件把類Unix-like調用替換為WinAPI,用它移植的軟件無需依賴第三方庫,可直接運行在Windows平臺。為了達到類Unix軟件僅通過重新編譯移植到Win的目的,Cygwin在運行時偷梁換柱,MingW在編譯時偷梁換柱。
用一個PE格式查看工具檢查一下就能發現,Cygwin生成的程序依然有fork()這樣的Linux系統調用,但目標庫是cygwin1。而MingW生成的程序,則全部使用從KERNEL32導出的標準Windows系統API。
推薦使用 MingW
https://www.cnblogs.com/findumars/p/6250998.html