PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C(++)] Linux



Crash-Override
12.02.2005, 16:20
Ich wollte letztens mal ein wenig C++-Code unter Linux kompilen. Habe allerdings festgestellt das ich davon keine Ahnung habe ;).

Ich habe zwar gpp auf dem System weis aber nicht welches Output-Format Linux braucht...

unter (ich glaube) man -k gpp hat er nichts gefunden. Unter gpp --help zwar schon, aber da stand nichts darüber...

Den C-Code selbst habe ich einfach mal in ne .c-Datei (/Home/BG/C-Dateien/Hello.c) gespeichert...

MuadDib
12.02.2005, 16:27
gcc -o outputfile sourcefiles

ist wohl die einfachste Variante. Komplizierter wirds mit compiler und linker flags, dafür biete ich dir einfach mein standard-makefile an, bei dem du alle nennenswerten Parameter ändern kannst.



CC=gcc
# hier dein programmname
prog=hello
# deine linker-flags (also die bibliotheken, die du reinlinkst, wie z.b: -lm -lGL ... etc.)
LFLAGS=
# deine compiler-flags, also alles, was der compiler schon beim übersetzen
# beachten soll (-ansi, -O3, etc.)
CFLAGS =
# deine quelldateien
SFILES =

all: $(prog)

${prog}: $(SFILES)
$(CC) $(CFLAGS) -o $(prog) $(SFILES) $(LFLAGS)


run:
./$(prog)

clean:
rm -f $(prog)
rm -f *~
rm -f *.o

Lukas
12.02.2005, 16:28
Ich halte das nicht für so schwer. Du rufst den Compiler mit "g++ Dateiname" auf, er erzeugt dann eine Datei namens a.out (den Dateinamen kannst du mit dem Flag "-o Dateiname" ändern). Diese Datei rufst du mit ./a.out auf, dann müsste sie ausgeführt werden. Wenn du das Programm von überall aufrufen willst, musst du es ins Verzeichnis /home/BG/bin kopieren (bzw. mit dem -o Flag direkt dahin kompilieren).

Das mit dem Output verstehe ich nicht, der Compiler erzeugt automatisch ein Binary.

Edit:
Mist, zu langsam.

Crash-Override
12.02.2005, 17:32
Ja, nur bei OS-Dev ruf ich das ganze so auf:
nasm -f bin -o kernel.bin kernel.asm
bzw.
gcc -c Driver\floppy.c -o Compiled\floppy.o

nur so als Beispiel. _Ich wollte nur wissen was Linux so zum ausführen braucht wie z.B. bei Windows Exe oder bei DOS com...

Ich werds mal so probieren...

Danke...

Lukas
12.02.2005, 18:10
Ich wollte nur wissen was Linux so zum ausführen braucht wie z.B. bei Windows Exe oder bei DOS com...
Das ist ein weiterer Vorteil von Linux gegenüber Windoof: es erkennt automatisch am Inhalt der Datei, was sie für einen Typ hat. So kann man die Datei nicht durch Änderung des Namens unbrauchbar machen.
Ein ausführbares Binary ist ein ausführbares Binary, egal wie es heißt. Es braucht keine Endung.

Crash-Override
12.02.2005, 19:20
Äuserst praktisch will ich meinen ;)

Aber ich habe ja mit meinem Programm eine Terminal-Application. Gibt es nicht irgendein Format das (zumindestens) auf den meisten Linux-Rechnern automatisch im Terminal startet oder gibt es etwas wie die .bat Dateien unter Windows?

Desweiteren wollte ich fragen ob und wie ich übergabe-parameter auslesen kann.

Soll heißen so was wie

ping rpg-ring.com
das ist das rpg-ring.com ja eine übergabe an das programm. Wie bekomm ich das? Hab bei google seltsammerweise nichts besonderes gefunden nur übergabeparameter von funktionen....

Lukas
12.02.2005, 19:30
Äuserst praktisch will ich meinen ;)

Aber ich habe ja mit meinem Programm eine Terminal-Application. Gibt es nicht irgendein Format das (zumindestens) auf den meisten Linux-Rechnern automatisch im Terminal startet oder gibt es etwas wie die .bat Dateien unter Windows?

Desweiteren wollte ich fragen ob und wie ich übergabe-parameter auslesen kann.

Soll heißen so was wie

ping rpg-ring.com
das ist das rpg-ring.com ja eine übergabe an das programm. Wie bekomm ich das? Hab bei google seltsammerweise nichts besonderes gefunden nur übergabeparameter von funktionen....
Google mal nach "Shell-Script". Die können sogar deutlich mehr als Batch-Dateien ;)
Wie meinst du das mit der Übergabe? Bei Shell-Scripten kenne ich mich damit nicht aus.
Bei C++ musst du die main()-Funktion anders deklarieren:
int main(int argc, char* argv[])
in argc steht die Anzahl der Argumente, argv ist ein String- (oder besser gesagt char*-) Array, in dem die Argumente stehen. Das erste Argument ist immer der Name des Programms.

Jesus_666
12.02.2005, 19:36
Äuserst praktisch will ich meinen ;)

Aber ich habe ja mit meinem Programm eine Terminal-Application. Gibt es nicht irgendein Format das (zumindestens) auf den meisten Linux-Rechnern automatisch im Terminal startet oder gibt es etwas wie die .bat Dateien unter Windows?
Das Linux-Äquivalent zu Windows-Batchdateien sind Shellskripte, die du in einer Reihe von Sprachen schreiben kannst: Die integrierte bash-Skriptsprache, Perl, PHP, Ruby...
Damit Programme in der Shell laufen mußt du nichts besonderes tun. Einfach schreiben und kompilieren.



Desweiteren wollte ich fragen ob und wie ich übergabe-parameter auslesen kann.

Soll heißen so was wie

ping rpg-ring.com
das ist das rpg-ring.com ja eine übergabe an das programm. Wie bekomm ich das? Hab bei google seltsammerweise nichts besonderes gefunden nur übergabeparameter von funktionen....
Mach dich mal über die Variablen argc und argv schlau (siehe Post über mir). Und am Besten auch über getopt; das ist eine Bibliothek, mit der du Optionen in der Argumentliste standardisiert parsen kannst.

Crash-Override
12.02.2005, 20:44
Hey, Leute ihr habt mir echt geholfen bei meinem 1. C++ Proggy unter Linux ;)

Deshalb hab ich euch mal mit in den Source geschoben...

Entstanden ist aus euren Tipps das Programm Calki, das einen Taschenrechner darstellt:

Man kann es über ./Calki starten, dann fragt es die ganzen Daten (Zahle etc) ab oder man startet es direkt über
./Calki -a 10 -b 11 -c * [Für 10 * 11]

Wenn man es direkt über ./Calki startet fragt es am Ende jeder Berechnung ob eine weitere durchgeführt werden soll. Falls ihr ja sagt, dann wird bei der nächsten Abfrage die Zahl 0 automatisch durch das letzte Ergebis ersetzt.

So, hier ist der Source:



// Calki 1.0 by B.G.
// (c) 2005 by Fat Fish Software ··· [B.G.]

#include <iostream.h>
#include <stdio.h>
#include <unistd.h>

float Zahl1 = 0;
float Zahl2 = 0;
float Ergebnis = 0;
char art = '+';
int Fortsetzen(void);
float last = 0;
int o = 0;

int main (int argc, char **argv)
{
int c;

opterr = 0;

while ((c = getopt (argc, argv, "a:b:c:")) != -1)
switch (c)
{
case 'a':
sscanf(optarg,"%f",&Zahl1);
o = 1;
break;
case 'b':
sscanf(optarg,"%f",&Zahl2);
o = 1;
break;
case 'c':
art = optarg[0];
o = 1;
break;
case '?':
if (isprint (optopt))
fprintf (stderr, "Unknown option `-%c'.\n", optopt);
else
fprintf (stderr, "Unknown option character `\\x%x'.\n", optopt);
return 1;
}
if (o == 1)
{
if (art != '+')
{
if (art != '-')
{
if (art != '/')
{
if (art != 'x')
{
cout << "\n\nUngueltiger Operator!\n\n";
return(0);
}
}
}
}
if (art == '+')
{
Ergebnis = Zahl1 + Zahl2;
}
if (art == '-')
{
Ergebnis = Zahl1 - Zahl2;
}
if (art == 'x')
{
Ergebnis = Zahl1 * Zahl2;
}
if (art == '/')
{
Ergebnis = Zahl1 / Zahl2;
}
cout << "\n\n" << Zahl1 << " " << art << " " << Zahl2 << " = " << Ergebnis;
return(0);
}


cout << "\n\nCalki! 1.0 by B.G.\n";
cout << "Thx to masterquest, MuadDib and to Jesus_666\n\n";
do
{
cout << "\nGeben Sie einen Operator ein: [+|-|/|x]";
cin >> art;
if (art != '+')
{
if (art != '-')
{
if (art != '/')
{
if (art != 'x')
{
cout << "\n\nUngueltiger Operator!\n\n";
return(0);
}
}
}
}
cout << "Geben Sie nun die Erste Zahl ein: ";
cin >> Zahl1;
cout << "Geben Sie nun die Zweite Zahl ein: ";
cin >> Zahl2;

if (Zahl1 == 0)
{
Zahl1 = last;
cout << "\nDie 1. Zahl nimmt Wert der letzten Berechnung an (" << last << ")";
}
if (Zahl2 == 0)
{
Zahl2 = last;
cout << "\nDie 2. Zahl nimmt Wert der letzten Berechnung an (" << last << ")";
}

if (art == '+')
{
Ergebnis = Zahl1 + Zahl2;
}
if (art == '-')
{
Ergebnis = Zahl1 - Zahl2;
}
if (art == 'x')
{
Ergebnis = Zahl1 * Zahl2;
}
if (art == '/')
{
Ergebnis = Zahl1 / Zahl2;
}
last = Ergebnis;
cout << "\n\n" << Zahl1 << " " << art << " " << Zahl2 << " = " << Ergebnis;
}
while(Fortsetzen()!=0);
return 0;
}

int Fortsetzen(void)
{
char JaNein = 'j';

cout << "\n\nWeitere Berechnung durchführen?";
cin >> JaNein;
if('j' == JaNein)
{
return(1);
}
if('n' == JaNein)
{
return(0);
}
}


Nennt die Source-Datei 'Calki.cpp' und erstellt noch diese makefile (nenn sie 'makefile')



all: Calki

Calki: Calki.cpp
g++ Calki.cpp -o Calki

run: Calki
./Calki

clean:
rm -f Calki


Jetzt wechsle ins Verzeichnis und führe make [run] aus...

EDIT:
Es gibt seltsammerweise einen Fehler... wenn man das Prog .\Calki -a 10 -b 10 -c * [also überhaupt mit mal] aufruft rechnet er nicht... kA worans liegt...

Edit2:
Habs gelöst... Man muss jetzt aber statt * ein x für mal setzen...
./Calki -a 10 -b 10 -c x

Ausgabe: 10 x 10 = 100

Edit3:
Danke, hab die Datei in .cpp umbenannt und die Make angepasst...

Thx für die Infos

Jesus_666
13.02.2005, 00:15
Ein kleiner Hinweis noch: Verwende für C++-Code nicht die Dateiendung .c, sonst könnte man denken, daß es sich um C-Code handelt. Übliche Endungen für C++-Code sind .cpp oder .cxx.

Und noch was zum Makefile: Du kannst bei den einzelnen Zielen noch Abhängigkeiten vorgeben. Das sind Dateien, die benötigt werden, um ein bestimmtes Ziel bauen zu können. Wenn eine als Abhängigkeit genannte Datei seit dem letzten Aufruf von make verändert wurde wird das entsprechende Ziel neu gebaut.
Wenn du also für run als Abhängigkeit Calki angibst, dann wird erst das Ziel Calki ausgeführt, befor run durchläuft. Wenn du bei Calki als Abhängigkeit Calki.c angibst, dann wird das Programm nur dann neu gebaut, wenn Calki.c verändert wurde - womit du dir das clean bei all sparen kannst.

Das Makefile sieht dann so aus:

all: Calki

Calki: Calki.c
g++ Calki.c -o Calki

run: Calki
./Calki

clean:
rm -f Calki
Wenn du jetzt make run eingibst, dann wird erst überprüft, ob die Datei Calki existiert. Wenn sie fehlt oder wenn sie älter ist als Calki.c wird das Programm (neu) kompiliert. Dann wird es ausgeführt.