簡體   English   中英

如何使Linux命令行程序在Windows中工作?

[英]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 / cerrprintf / scanf / fprintf(stderr, ...)使用在Linux和Windows中定義的標准C預打開文件stdinstdoutstderr 從Windows終端( cmd )運行應用程序后,您將看到與Linux終端中完全相同的輸入/輸出。 I / O重定向也非常相似。

cincout ,以及printfscanf ,在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 SDKVisual 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,就像在不同的系統上一樣,也有不同的處理環境變量的方式等。這些都是等等。因此,文件擴展的處理方式不同。 但是,兩個正在運行的進程都有默認流,如stderrstdoutstdin 但是在C代碼下面它們不一樣。

這就像駕駛柴油車和汽油車一樣。 很多是相同的,但在引擎蓋下相當多的東西是不同的。

請注意,即在Windows上處理不同的信號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM