繁体   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