3

我是一名编程初学者,我一直在 Ubuntu 中使用 C/C++ 工作。当我告诉 cin/cout/cerr 或 printf/scanf 或从命令行获取参数时,这一切都发生在 Ubuntu 的 linux 终端上。

现在,如果我想运行这些相同的程序(非常简单的程序,初学者级别)并在 Windows 中运行它们,我如何从 Windows 命令行运行它们?我之前上的一门课程让我们下载 cygwin 来模拟 windows 中的 linux 命令行,但是如果我只想从普通的 windows 命令行运行程序怎么办?这可能吗,是否需要修改软件?

4

6 回答 6

6

您可以从 linux 交叉编译适用于 Windows 的程序。

在 Ubuntu 上,过程基本上是这样的:

sudo apt-get install wine mingw32 mingw32-binutils mingw32-runtime

...

i586-mingw32msvc-g++ -o myProgram.exe myProgram.cpp

容易,对吧?谷歌搜索“ubuntu cross-compile windows”,那里有大量信息。

于 2012-04-14T23:54:13.767 回答
4

完全一样。cmd您(几乎)完全像在 Linux 中那样运行和编写命令。

例如,如果您将程序构建为program,您将在 Linux 中像这样运行它:

./program --option1 -o2 file1 file2

在 Windows 中,首先你必须让输出有一个.exe后缀,然后cmd你会写:

program.exe --option1 -o2 file1 file2

基本上说,cmd是Windows的终端。它远不如 Linux 终端好,但如果不安装额外的软件,这就是你所获得的一切。


cin//和cout//使用标准的C 预打开文件,这些文件在 Linux和Windows中都有定义。从 Windows 终端 ( ) 运行应用程序后,您会看到与在 Linux 终端中完全相同的输入/输出。I/O 重定向也非常相似。cerrprintfscanffprintf(stderr, ...)stdinstdoutstderrcmd

于 2012-04-14T23:50:41.710 回答
1

cincout、 和printfscanf在 Windows 中的工作方式与在 Linux 中的工作方式大致相同。(我也很确定cerr,但我不是 100% 确定。至少,它在那里并且可以工作。)最大的区别是 Windows 通常不会扩展通配符(类似的东西*.txt)在运行程序之前;在大多数情况下,你必须自己做。

基本上,只要应用程序不使用任何特定于 Linux 或 GCC 的东西,您就可以使用您喜欢测试的任何编译器在目标机器上重新编译它。

如果你不想重新编译......好吧......祝你好运。甚至 Cygwin 也不会运行本机 Linux 二进制文件。您需要一台装有 Linux 的虚拟机。

于 2012-04-14T23:52:25.053 回答
0

好吧,如果您的程序是可移植的并且不使用任何特定于 Linux 的功能,那么您必须在 Windows 上从源代码编译它以使其在 Windows 上工作。

您需要 Windows 的 GCC 工具链来执行此操作,您可以从TDM-GCC主页获得该工具链。它的MinGW内部和安装程序允许您选择要安装的功能以及安装的目标目录。它还将自身添加到 Windows 路径中,以便可以从 shell 提示符处使用编译器命令。

我必须定期进行交叉编译,它对我来说没有任何问题。如果您的项目使用 Makefile,则必须进行一项更改。对于目标二进制文件,例如<target>.out在 linux 中,您必须编辑 Makefile 并将其重命名为,<target>.exe以便它在命令行上运行。如果您不使用 Makefiles 而只是在做gcc <file.c>a.exe默认情况下会生成 (类似于a.out在 Linux 中)。

于 2012-04-15T00:03:11.943 回答
0

假设您有想要在 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>
于 2012-04-15T00:23:22.430 回答
0

当 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,stdoutstdin. 但是你的 C 代码下面,它们是不一样的。

这就像驾驶柴油车与汽油车。很多是相同的,但在引擎盖下有很多东西是不同的。

请注意,ie 信号在 Windows 上的处理方式不同。

于 2012-04-15T00:58:52.637 回答