2012-04-14 8 views
3

Ich bin ein Anfänger mit der Programmierung, und ich habe in C/C++ in Ubuntu zu tun Arbeit. Wenn ich etwas zu cin/cout/cerr oder printf/scanf erzähle oder Argumente von der Kommandozeile nehme, passiert das alles vom Linux-Terminal in Ubuntu.Wie ein Linux-Kommandozeilenprogramm in Windows arbeiten?

Wenn ich jetzt diese gleichen Programme (sehr einfache Programme, Anfänger-Ebene) ausführen und in Windows ausführen möchte, wie führe ich sie über die Windows-Befehlszeile aus? Ein vorheriger Kurs, den ich genommen habe, ließ uns cygwin herunterladen, um die Linux-Befehlszeile in Windows zu simulieren, aber was, wenn ich das Programm nur von der gewöhnlichen Windows-Befehlszeile ausführen möchte? Ist das möglich und bedarf es einer Modifikation der Software?

+0

Es gibt keine "simulierte Befehlszeile". Windows verfügt wie Linux über eine native Befehlszeilenschnittstelle. –

+1

@KerrekSB: Cygwin bietet eine Unix-ähnliche Umgebung unter Windows. Die Cygwin-Befehlszeile ist * nicht * die Windows-Befehlszeile. – celtschk

+0

@celtschk: Cygwin ist in erster Linie eine Posix-API für Win32. Obwohl es zusätzliche Terminal-Unterstützung gibt, ist das für die Situation des OP nicht zentral. –

Antwort

6

Sie können das Programm für Windows von Linux aus kompilieren.

Unter Ubuntu Prozess ist dies im Grunde:

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

...

i586-mingw32msvc-g ++ -o MyProgram.EXE myProgram.cpp

einfach, nicht wahr? Google für "Ubuntu Kreuz-kompilieren Windows" gibt es eine Menge Informationen da draußen.

4

Es ist genau das gleiche. Sie laufen cmd und schreiben den Befehl (fast) genau wie in Linux.

Zum Beispiel, wenn Sie Ihr Programm program bauen, würden Sie es in Linux wie folgt ausführen:

./program --option1 -o2 file1 file2 

Und in Windows, müssen Sie zuerst die Ausgabe machen einen .exe Suffix und dann in cmd Sie würde schreiben:

program.exe --option1 -o2 file1 file2 

Grundsätzlich sagen cmd ist Terminal von Windows. Es ist bei weitem nicht so gut wie das Linux-Terminal, aber das wäre alles, was Sie bekommen, ohne zusätzliche Software zu installieren.


cin/cout/cerr und printf/scanf/fprintf(stderr, ...) das Standard-C öffneten Dateien verwenden stdin, stdout und stderr, die sowohl in Linux und Windows definiert sind. Sobald Sie die Anwendung vom Windows-Terminal aus starten (cmd), sehen Sie die Eingabe/Ausgabe genauso wie im Linux-Terminal. Die I/O-Umleitung ist ebenfalls sehr ähnlich.

+0

Durch das Cross-Compiling umgehen Sie Probleme mit der Shell cmd.exe. Ein Linux-Programm, das auf Shell-Erweiterungen basiert, die für Windows kompiliert wurden, funktioniert immer noch wie erwartet, aber wenn es mit MSVC kompiliert wird, wird die Shell-Erweiterung fehlschlagen. –

+0

@ggg, was meinst du mit Shell-Erweiterung? Und was hat (Cross-) Compiling mit der Eingabe und Eingabe der Ausgabe zu tun ?! – Shahbaz

+0

Er meint, dass die Binärdatei für Linux nicht einfach unter Windows läuft, indem sie die Erweiterung '.exe' hinzufügt. Es muss von der Quelle für Windows kompiliert werden. – vvnraman

1

cin und cout und printf und scanf, funktionieren in Windows genauso wie unter Linux. (Ich bin mir ziemlich sicher, dass cerr auch der Fall ist, sondern dass man ich bin nicht 100% sicher. Am allerwenigsten, aber es ist da und funktioniert.) Der größte Unterschied ist, dass Windows wird in der Regel keine Platzhalter erweitern (Sachen wie *.txt) bevor Sie Ihr Programm ausführen; Sie müssen das in den meisten Fällen selbst tun.

Solange die App nichts verwendet, was für Linux oder GCC spezifisch ist, können Sie sie einfach auf dem Zielcomputer mit dem Compiler kompilieren, den Sie testen möchten.

Wenn Sie nicht neu kompilieren wollen ... nun ... viel Glück damit. Selbst Cygwin wird keine nativen Linux-Binärdateien ausführen. Sie benötigen eine virtuelle Maschine mit Linux.

0

Nun, wenn Sie Programm ist portabel und keine speziellen Funktionen für Linux verwenden, müssten Sie es von der Quelle auf Windows kompilieren, damit es unter Windows funktioniert.

Sie benötigen die GCC Tool-Kette für Windows, die Sie von der TDM-GCC Homepage erhalten können. Seine MinGW intern und das Installationsprogramm ermöglicht Ihnen die Auswahl der Features, die Sie installieren möchten, sowie das Zielverzeichnis für die Installation. Es fügt sich auch dem Windows-Pfad hinzu, sodass die Compiler-Befehle über die Shell-Eingabeaufforderung verfügbar sind.

Ich muss die Cross-Compilation regelmäßig machen und es funktioniert ohne Probleme für mich. Es gibt eine Änderung, die Sie vornehmen müssen, wenn Ihr Projekt Makefiles verwendet. Für die Ziel-Binärdatei, wie zum Beispiel <target>.out in Linux, müssten Sie Ihr Makefile bearbeiten und in <target>.exe umbenennen, damit es in der Befehlszeile ausgeführt wird. Wenn Sie Makefiles nicht verwenden und einfach gcc <file.c> machen, wird standardmäßig a.exe erzeugt (ähnlich wie a.out in Linux).

0

Sagen Sie bitte diesen Programmcode haben Sie auf UNIX und Windows ausgeführt werden sollen:

#include <stdio.h> 
int main() 
{ 
    printf("Hi\n"); 
    return 0; 
} 

Wenn Sie einen Befehl in einem UNIX-Typ Shell wird es so etwas wie diese.

/usr/home/bobby# gcc main.c 
/usr/home/bobby# ./a.out 
Hi 
/usr/home/bobby# 

Unter Windows müssen Sie zuerst Ihre Entwicklungsumgebung/Compiler auswählen. Ohne zu etwas wie Cygwin zu gehen, könnten Sie die Windows SDK oder Visual studio installieren (obwohl wenn letzteres Sie vielleicht nur in der GUI entwickeln möchten).

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> 
0

Wenn ein C-Programm in eine ausführbare Datei kompiliert wird, erfolgt dies systemabhängig. Unter Ubuntu wird das ELF Format verwendet und unter Windows haben wir .

Wenn Sie einen Prozess starten, wird der ELF oder PE gelesen und gibt Anweisungen/Zuordnung zur Zuweisung von Speicher und zur Ablage verschiedener Prozessabschnitte in einer virtuellen Speichertabelle. Außerdem verbindet es sich mit dynamisch geladenen Bibliotheken, die bereits im physischen Speicher vorhanden sind und die es mit anderen Prozessen teilen, die dieselben Bibliotheken verwenden. Wenn die dynamischen Bibliotheken nicht vorhanden sind, laden Sie sie. (Linux .so, Windows .dll). Wenn es statische Bibliotheken hat, werden diese zugewiesen und verlinkt (Linux .a, Windows .lib). - Sehr vereinfacht.

Speichereinschränkungen usw. werden vom vorherigen Prozess übernommen.

Umgebungsvariablen werden in die laufende Umgebung für den Prozess eingefügt. Dies sind Pfade, Argumente usw. Dann wird main() zum Stack hinzugefügt und aufgerufen.

Jetzt wird alles, was vor main passiert, aufgerufen und wie die Verbindung usw. gelöst ist, und so viele andere Dinge, hängt vom System ab. Aus diesem Grund kann man unter Linux keine ausführbare Datei ausführen.

Mit cygwin erstellt man einfach eine virtuelle Umgebung, in der diese Verknüpfungen usw. gleich sind und funktionieren würden. Man erstellt eine ELF-Umgebung.

Um es für native Windows-Befehlszeile verknüpft zu bekommen, müsste man für Windows kompilieren. In dieser Hinsicht sehe ich, dass es bereits viele Antworten gibt.

Die ELF und PE, wie auf verschiedenen Systemen, haben auch verschiedene Möglichkeiten der Handhabung von Umgebungsvariablen etc. Was diese sind etc. So datei Dateierweiterung wird anders behandelt. Beide laufenden Prozesse haben jedoch die Standard-Streams wie stderr, stdout und stdin. Aber unter Ihr Code in C sie sind nicht das Gleiche.

Es ist wie das Fahren eines Diesels gegen ein Benzinauto. Vieles ist das Gleiche, aber unter der Haube ist einiges anders.

Beachten Sie, dass Signale unter Windows anders behandelt werden.

Verwandte Themen