[英]How to make a linux command-line program work in windows?
我是編程的初學者,我一直在Ubuntu中使用C / C ++工作。 當我告訴cin / cout / cerr或printf / scanf或從命令行獲取參數時,這一切都發生在Ubuntu的linux終端。
現在,如果我想運行這些相同的程序(非常簡單的程序,初學者級別)並在Windows中運行它們,我該如何從Windows命令行運行它們? 我之前的課程讓我們下載了cygwin來模擬windows中的linux命令行,但是如果我想從普通的Windows命令行運行該程序呢? 這可能嗎,是否需要修改軟件?
您可以從linux交叉編譯Windows程序。
在Ubuntu上,進程基本上是這樣的:
sudo apt-get install wine mingw32 mingw32-binutils mingw32-runtime
...
i586-mingw32msvc-g ++ -o myProgram.exe myProgram.cpp
容易,對嗎? 谷歌的“ubuntu交叉編譯窗口”,那里有大量的信息。
它完全一樣。 您運行cmd
並完全像在Linux中一樣編寫命令(幾乎)。
例如,如果您將程序構建為program
,則可以在Linux中運行它,如下所示:
./program --option1 -o2 file1 file2
在Windows中,首先必須使輸出具有.exe
后綴,然后在cmd
寫入:
program.exe --option1 -o2 file1 file2
基本上說, cmd
是Windows的終端。 它遠沒有Linux終端那么好,但如果沒有安裝其他軟件,那將是你所能獲得的。
cin
/ cout
/ cerr
和printf
/ scanf
/ fprintf(stderr, ...)
使用在Linux和Windows中定義的標准C預打開文件stdin
, stdout
和stderr
。 從Windows終端( cmd
)運行應用程序后,您將看到與Linux終端中完全相同的輸入/輸出。 I / O重定向也非常相似。
cin
和cout
,以及printf
和scanf
,在Windows中的工作方式與在Linux中的工作方式大致相同。 (我很確定cerr
也是這樣做的,但是那個我不是100%肯定的。但至少,它確實存在並且有效。)最大的區別是Windows通常不會擴展通配符(類似於*.txt
)在運行程序之前; 在大多數情況下,你必須自己做。
基本上,只要應用程序不使用特定於Linux或GCC的任何內容,您就可以使用您要測試的任何編譯器在目標計算機上重新編譯它。
如果你不想重新編譯......那么......祝你好運。 即使是Cygwin也不會運行本機Linux二進制文件。 您需要一台帶有Linux的虛擬機。
好吧,如果您的程序是可移植的並且沒有使用Linux特有的任何功能,則必須在Windows上從源代碼編譯它以使其在Windows上運行。
你需要Windows的GCC工具鏈來做到這一點,你可以從TDM-GCC主頁獲得。 其內部的MinGW和安裝程序允許您選擇要安裝的功能以及安裝的目標目錄。 它還將自身添加到Windows路徑,以便可以從shell提示符獲得編譯器命令。
我必須定期進行交叉編譯,它對我沒有任何問題。 如果您的項目使用Makefile,則必須進行一項更改。 對於目標二進制文件,例如linux中的<target>.out
,您必須編輯Makefile並將其重命名為<target>.exe
以便它在命令行上運行。 如果您不使用Makefile並且只是執行gcc <file.c>
a.exe
gcc <file.c>
,則默認生成a.exe
(類似於Linux中的a.out
)。
假設您有要在UNIX和Windows上運行的程序代碼:
#include <stdio.h>
int main()
{
printf("Hi\n");
return 0;
}
在UNIX shell中鍵入命令時,它將是這樣的。
/usr/home/bobby# gcc main.c
/usr/home/bobby# ./a.out
Hi
/usr/home/bobby#
在Windows上,您必須首先選擇開發環境/編譯器。 不用像Cygwin這樣的東西,你可以安裝Windows SDK或Visual studio (雖然如果后者你可能只想在GUI中開發)。
Start -> Run -> cmd /k ""C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"" x86
C:\Windows\system32>cd c:\bobby
C:\bobby>cl main.c
C:\bobby>main.exe
Hi
C:\bobby>
當C程序被編譯成可執行文件時,這是以系統相關的方式完成的。 在Ubuntu上使用ELF格式,在Windows上我們有PE 。
當您啟動進程時,將讀取ELF或PE,提供有關如何分配內存的說明/映射以及將進程的各個部分放在虛擬內存表中的位置。 此外,它鏈接到已經在物理內存中的動態加載庫,它與使用相同庫的其他進程共享。 或者如果動態庫不存在則加載它們。 (Linux .so,windows .dll)。 如果它有靜態庫,則會在(Linux .a,Windows .lib)中分配和鏈接它們。 - 非常簡化。
內存限制等繼承自先前的進程。
環境變量被放入流程的運行環境中。 這是路徑,參數等。然后main()
被添加到堆棧並被調用。
現在調用main之前發生的所有事情以及如何解決鏈接等等,以及許多其他事情,取決於系統。 這就是為什么一個人根本無法在Windows上運行在Linux上編譯的可執行文件。
使用cygwin
只需創建一個虛擬環境,其中這些鏈接等相同並且可以工作。 一個人創建一個ELF環境。
要將其鏈接到本機Windows命令行,必須為Windows編譯。 在這件事上,我看到已經有很多答案了。
ELF和PE,就像在不同的系統上一樣,也有不同的處理環境變量的方式等。這些都是等等。因此,文件擴展的處理方式不同。 但是,兩個正在運行的進程都有默認流,如stderr
, stdout
和stdin
。 但是在C代碼下面它們不一樣。
這就像駕駛柴油車和汽油車一樣。 很多是相同的,但在引擎蓋下相當多的東西是不同的。
請注意,即在Windows上處理不同的信號。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.