it-swarm.dev

C++ - Entwicklung unter Linux - wo fange ich an?

Ich habe mich entschieden, meine Windows-Installation zurückzulassen und verwende jetzt Debian als mein Standard-Betriebssystem. Ich habe immer in Windows und speziell mit Visual Studio codiert. Ich versuche gerade, mich daran zu gewöhnen, meinen Code unter Linux zu kompilieren.

Obwohl ich noch eine Menge Dokumentation zu lesen habe und nicht erwarte, dass ihr es mir zu einfach macht, wäre es trotzdem schön, ein paar Hinweise zu bekommen, wo ich anfangen soll. Ich habe einige spezifische Fragen, kann aber gerne weitere Vorschläge zum Thema machen/empfehlen.

  • Was sind die empfohlenen Anleitungen zum Erstellen einer make-Datei, wie kompiliere ich aus diesem Makefile (rufe ich g ++ selbst auf, verwende ich 'make'?)
  • Bei anderen Linux-Programmen scheint es fast immer eine Konfigurationsdatei zu geben. Was genau macht es? Prüft es nur, ob die erforderlichen Bibliotheken installiert sind, oder prüft es mehr als nur die Anforderungen?
  • Wie verbinde ich Bibliotheken und in welcher Beziehung stehen diese zu meinen Makefile- oder G ++ - Parametern? In Windows kompilierte ich die Bibliothek, fügte einige Header-Dateien hinzu, teilte meinem Linker mit, welche zusätzliche lib-Datei verknüpft werden sollte, und kopierte eine DLL-Datei. Wie genau funktioniert dieser Prozess unter Linux?
  • Empfehlungen für Code-Editoren? Ich verwende derzeit Nano und habe von Vim und Emacs gehört, weiß aber nicht, welche Vorteile sie sich gegenseitig bieten. Gibt es noch andere, und warum sollte ich sie gegenüber den drei vorhergehenden in Betracht ziehen? Hinweis: Ich suche keine IDE.

Hilfe, Links zu Anleitungen und Dokumentationen (vorzugsweise für Anfänger) sind sehr willkommen!

30
Daniel Sloof

Was sind die empfohlenen Anleitungen zum Erstellen einer make-Datei, wie kompiliere ich aus diesem Makefile (rufe ich g ++ selbst auf, verwende ich 'make'?)

Sie erstellen aus dem Makefile, indem Sie "make" aufrufen. Und in Ihrem Makefile kompilieren und verknüpfen Sie mit g ++ und ld.

Bei anderen Linux-Programmen scheint es fast immer eine Konfigurationsdatei zu geben. Was genau macht es? Prüft es nur, ob die erforderlichen Bibliotheken installiert sind, oder prüft es mehr als nur die Anforderungen?

Es ist ein Skript, das normalerweise verwendet wird, um verschiedene Dinge basierend auf der Umgebung, die zum Erstellen verwendet wird, einzurichten. Manchmal handelt es sich nur um ein einfaches Shell-Skript, manchmal werden Tools wie Autoconf aufgerufen, um festzustellen, was beim Erstellen verfügbar ist. Das "configure" -Skript ist normalerweise auch ein Ort, an dem der Benutzer verschiedene optionale Dinge angeben kann, die erstellt oder ausgeschlossen werden sollen, wie die Unterstützung für experimentelle Funktionen.

Wie verbinde ich Bibliotheken und in welcher Beziehung stehen diese zu meinen Makefile- oder G ++ - Parametern? In Windows kompilierte ich die Bibliothek, fügte einige Header-Dateien hinzu, teilte meinem Linker mit, welche zusätzliche lib-Datei verknüpft werden sollte, und kopierte eine DLL-Datei. Wie genau funktioniert dieser Prozess unter Linux?

ld ist der Linker GNU. Sie können es separat aufrufen (was bei den meisten Makefiles der Fall ist), oder Sie können g ++ delegieren. Die Optionen, die Sie an g ++ und ld übergeben, bestimmen, wo nach eingeschlossenen Headern und zu verlinkenden Bibliotheken gesucht und wie das Ergebnis ausgegeben werden soll.

Empfehlungen für Code-Editoren? Ich verwende derzeit Nano und habe von Vim und Emacs gehört, weiß aber nicht, welche Vorteile sie sich gegenseitig bieten. Gibt es noch andere, und warum sollte ich sie gegenüber den drei vorhergehenden in Betracht ziehen? Hinweis: Ich suche keine IDE.

Vim und Emacs sind sehr flexible Editoren, die eine ganze Reihe verschiedener Anwendungen unterstützen. Verwenden Sie, was für Sie am besten ist, obwohl ich vorschlagen würde, dass Sie ein paar minimale Dinge wie Syntaxhervorhebung wünschen.

22
MandyK

Nur eine Anmerkung zu den Antworten von MandyK.

Das Erstellen von make-Dateien von Hand ist normalerweise eine sehr unportable Methode, um Linux-Distributions-/Unix-Varianten zu erstellen. Es gibt viele Build-Systeme zum automatischen Generieren von Make-Dateien, die ohne Make-Dateien erstellt werden. GNU Autotools , Cmake , Scons , Jam , etc.

Gehen Sie auch näher auf configure ein.

  • Überprüft verfügbare Compiler, Bibliotheken und Systemarchitekturen.
  • Stellen Sie sicher, dass Ihr System mit der entsprechenden Liste kompatibler Pakete übereinstimmt.
  • Ermöglicht die Angabe von Befehlszeilenargumenten zur Spezialisierung von Build, Installationspfad, Optionspaketen usw.
  • Configure generiert dann ein entsprechendes, für Ihr System spezifisches Makefile.
13

Was sind die empfohlenen Anleitungen zum Erstellen einer make-Datei, wie kompiliere ich aus diesem Makefile (rufe ich g ++ selbst auf, verwende ich 'make'?)

Ich habe gelernt, wie man Makefiles schreibt, indem ich das GNU Make manual gelesen habe.

Bei anderen Linux-Programmen scheint es fast immer eine Konfigurationsdatei zu geben. Was genau macht es? Prüft es nur, ob die erforderlichen Bibliotheken installiert sind, oder prüft es mehr als nur die Anforderungen?

Die Konfigurationsdatei ist normalerweise mit autotools verknüpft. Wie der Name des Skripts andeutet, können Sie die Software konfigurieren. Aus Sicht des Entwicklers bedeutet dies meist das Setzen von Makros, die Variablen bestimmen, welche Bibliotheken zur Verfügung stehen und so weiter. Außerdem wird die Verfügbarkeit von Bibliotheken überprüft. Am Ende generiert das Skript ein GNU Makefile, mit dem Sie die Software erstellen und installieren können.

Das Build-System GNU ist nur eines von vielen. Ich mag das Build-System GNU nicht besonders, da es dazu neigt, langsamer zu sein als andere und ein hässliches Makefile erzeugt. Einige der populäreren sind CMake , Jam ( Boost Jam könnte für C++ von Interesse sein) und waf . Einige Build-Systeme generieren einfach Makefiles, während andere ein komplett neues Build-System bereitstellen. Für einfache Projekte wäre es einfach, ein Makefile von Hand zu schreiben, aber die "Abhängigkeitsprüfung" (für Bibliotheken usw.) müsste auch manuell durchgeführt werden.

Edit: Brian Gianforcaro wies auch darauf hin.

7
sebnow

Um Ihnen den Einstieg zu erleichtern, werde ich Sie zunächst auf diese Anleitung für Makefiles verweisen, die auch einige Verknüpfungselemente abdeckt.
Es ist nur eine Kleinigkeit, die mir mein Informatikprofi an der Universität beigebracht hat. Ich fand es sehr klar und prägnant, sehr hilfreich.

Und für eine IDE verwende ich Eclipse normalerweise, weil es auch das Makefile handhabt. Das Kompilieren und die Standardausgabe sind direkt im Programm verfügbar.
Es war hauptsächlich für die Java-Entwicklung gedacht, aber es gibt auch ein C/C++ - Plugin!

4
gnomed

Ihre Frage ist ein bisschen zu allgemein, aber hier ist, was ich empfehlen würde:

  • Editor: Vim und Emacs sind beliebt. Wie bei den meisten Werkzeugen ist es am wichtigsten, eines zu beherrschen. Ich benutze vim gerne, weil vi (sein Nachkomme) überall verfügbar ist, aber das mag nicht sehr relevant sein, besonders wenn Sie unter Linux bleiben. Jeder Programmiereditor ist in Ordnung.

  • konfigurieren: Wenn Sie keine großen Projekte durchführen, kümmern Sie sich nicht darum. Es ist ein Albtraum zu benutzen und zu debuggen. Es ist nur sinnvoll, wenn Sie beabsichtigen, Ihr Projekt zu verbreiten. Lesen Sie in diesem Fall das Autobook: http://sources.redhat.com/autobook/ . Wie gesagt, es gibt Alternativen (cmake, scons, etc ...). Ich bin sowohl mit Scons als auch mit Autotools vertraut, benutze aber immer noch make für kleine Projekte (ein paar Dateien).

In Bezug auf die gemeinsam genutzte Bibliothek: Es ist fast wie bei Windows, außer dass Sie eine direkte Verknüpfung mit der gemeinsam genutzten Bibliothek herstellen - in Linux gibt es keine Unterscheidung zwischen .lib und .dll. Zum Beispiel. für eine Bibliothek foo mit einer Funktion foo:

int foo(void)
{
     return 1;
}

Sie würden es wie folgt bauen:

gcc -fPIC -c foo.c -o foo.o
gcc -shared foo.o -o libfoo.so

Ein Haupt (natürlich im wirklichen Leben setzen Sie die API in eine Header-Datei):

int foo(void);

int main(void)
{
    foo();
    return 0;
}

Und dann verknüpfen Sie es wie folgt:

gcc -c main.c -o main.o
gcc main.o -o main -L. -lfoo 

Der -L. Soll hier angegeben werden, dass der Linker im aktuellen Verzeichnis nachschauen soll (im Gegensatz zu Windows wird dies unter Linux standardmäßig nie durchgeführt), sagt der -lfoo, dass ein Link gegen die Bibliothek foo erstellt werden soll.

4
  • Empfehlungen für Code-Editoren? Ich verwende derzeit Nano und habe von Vim und Emacs gehört, weiß aber nicht, welche Vorteile sie sich gegenseitig bieten. Gibt es noch andere, und warum sollte ich sie gegenüber den drei vorhergehenden in Betracht ziehen? Hinweis: Ich suche keine IDE.

Wenn Sie Linux mit einem Fenstermanager (KDE, Gnome usw.) verwenden, können Sie auch den Standard-Texteditor für Ihren Fenstermanager verwenden. Der Hauptvorteil gegenüber vim/emacs/nano ist, dass er für Windows-Benutzer vertrauter erscheint - ein Editor, der für die Ausführung im Fenstermanager geschrieben wurde, verfügt über eine Menüleiste, Dialogfelder zum Öffnen/Speichern von Dateien und Rückgängig/Wiederherstellen und viele andere nette Funktionen, mit denen Konsolen-Editoren wahrscheinlich nicht mithalten können. (Obwohl Emacs und Vim heutzutage ziemlich raffiniert sind, wer weiß das schon ;-P)

Unter KDE (was ich benutze) kann ich KWrite empfehlen, einen gut ausgestatteten, aber relativ einfachen Texteditor mit Syntaxhervorhebung. oder Kate, ein schicker Texteditor mit einigen zusätzlichen Funktionen: Sitzungsverwaltung, integriertes Terminalpanel, automatischer Aufruf von make und mehrere Plugins, einschließlich eines C/C++ - Symbol-Viewers. Normalerweise verwende ich Kate für meine C++ - Arbeit, wenn ich mich nicht mit dem Einrichten eines vollständigen IDE -Projekts beschäftigen möchte. (FYI das IDE für KDE ist KDevelop)

3
David Z

Empfehlungen für Code-Editoren? Ich verwende derzeit Nano und habe von Vim und Emacs gehört, weiß aber nicht, welche Vorteile sie sich gegenseitig bieten. Gibt es noch andere, und warum sollte ich sie gegenüber den drei vorhergehenden in Betracht ziehen? Hinweis: Ich suche keine IDE.

Vi und Emacs sind die beiden grundlegenden Unix-Editoren. Wenn Sie lieber einen Texteditor als eine IDE verwenden möchten, ist einer von ihnen oder ihre Ableitungen (vim, xemacs usw.) der richtige Weg. Beide unterstützen die Syntaxhervorhebung und alle Arten von Funktionen, entweder standardmäßig oder über Erweiterungen. Das Beste an diesen Editoren ist die Erweiterbarkeit, die sie bieten. emacs über eine Vielzahl von LISP und vim über eine eigene Skriptsprache.

Ich persönlich benutze Emacs, daher kann ich nicht viel über Vim sagen, aber Sie sollten in der Lage sein, online viele Informationen über beide zu finden. Emacs hat mehrere gute Tutorials und Referenzen, einschließlich dieses .

EDIT [Dez 2014]: In letzter Zeit scheint es einen Trend zu plattformübergreifenden und stark erweiterbaren Editoren zu geben. Dies könnte eine gute Wahl sein, wenn Sie weniger als eine IDE, aber grafischer als Vi/Emacs und native-Feeling auf mehreren Plattformen möchten. Ich empfehle mir Sublime oder Atom ; Beide funktionieren unter Windows/Linux/Mac und verfügen über eine hervorragende Community von Plugins und Themes.

3
thekidder

Ich empfehle das Buch The Art of Unix Programming von ESR. Es behandelt die Wahl des Editors, der Programmiersprache usw. Es gibt auch einen guten Sinn für die Denkweise hinter der Programmierung unter Unix oder Linux.

Für Redakteure möchten Sie wahrscheinlich entweder Vim oder Emacs. Sie sind beide verschieden und welche besser ist, hängt mehr vom persönlichen Geschmack ab als alles andere. Ich benutze Vim. Es ist großartig, um sich schnell im Code zu bewegen und Änderungen vorzunehmen. Ich mochte Emacs nicht so sehr, aber viele Leute tun es. Emacs ist extrem erweiterbar und kann für alles verwendet werden, vom Nachrichtenleser bis zum Ide. Probieren Sie beide aus und finden Sie heraus, was Ihnen gefällt.

3
Steve Rowe

Für jemanden, der aus Visual Studio kommt, mag all dieses Kommandozeilen-Zeug geheimnisvoll und chaotisch erscheinen. Bevor Sie sich in einen bash Shell/vim/emacs-Junkie verwandeln, probieren Sie zuerst einige GUI-basierte Tools aus, damit Sie eine gewisse Übergangszeit haben ...

  • QT 4.5 mit seiner QT Creator Mini-IDE. Dies ist der beste Rahmen, der der Konkurrenz um Lichtjahre voraus ist.
  • Eclipse (C++) - Aufgrund meiner Erfahrung unter Windows finde ich es erstaunlich (Dies ist wahrscheinlich die beste Java-Anwendung, die jemals geschrieben wurde)
  • KDevelop
  • Anjuta
  • Wenn Sie Delphi verwenden, ist Lazarus/FreePascal eine gute Alternative.

Ich bin sicher, die Langhaare werden sich lustig machen und behaupten, dass vim oder emacs ihnen die beste und schnellste Entwicklungsumgebung bietet, aber unterschiedliche Striche für verschiedene Leute. Jemand, der an eine IDE gewöhnt ist, braucht einige Zeit, um zu wechseln, oder möchte möglicherweise überhaupt nicht wechseln. Trotz all ihrer Bearbeitungsfähigkeiten ist das Erstellen von GUI-Apps keine Aufgabe für 80x25-Tools. Es dauert Jahre, um ein Experte für die Kommandozeilen-Seite der Dinge zu werden. Es ist mehr eine Transformation der Weltanschauung als alles andere.

2
rep_movsd

der Abstand zwischen dem direkten Aufrufen von g ++ und der Verwendung einer Autotool-Build-Kette ist ziemlich gering. Machen Sie sich mit Autotools vertraut, was einem in der Linux/Open Source-Welt verfügbaren "Projekt" am nächsten kommt.

Als Randbemerkung zu den richtigen Antworten hier. Für den Fall, dass Sie als Windows-Benutzer auf den Markt kommen möchten, empfehle ich das neue Qt SDK . Es wird sich wie zu Hause fühlen :-)

1
utku_karatas

Ich rate dazu, SCons anstelle von Make zu verwenden. Es erledigt den gleichen Job, ist aber einfacher zu verwenden und zu handhaben, wie dynamische Bibliotheken, Abhängigkeiten usw. erstellt werden. Hier ist ein reales Beispiel für ein einfaches Programm

env = Environment()
env.Append(CCFLAGS='-Wall')
env.Append(CPPPATH = ['./include/'])

env.MergeFlags('-ljpeg')
env.ParseConfig("sdl-config --cflags --libs")
env.ParseConfig("curl-config --cflags --libs")
env.ParseConfig("pkg-config cairo --cflags --libs")

env.Program('rovio-pilot', Glob('./src/*.cpp'))

Als Texteditor bin ich mit JEdit für die Codierung zufrieden, aber das ist Geschmackssache.

0
Monkey