it-swarm.dev

Wechsel von Windows zu Linux

Ich muss diese beiden Tatsachen in Einklang bringen:

  1. Ich fühle mich nicht wohl, wenn ich unter Linux arbeite.
  2. Ich muss Software für Linux entwickeln.

Einige Hintergrundinformationen: Ich habe mehr als 10 Jahre Programmiererfahrung unter Windows (fast ausschließlich C/C++, aber auch einige .NET). Ich war ungefähr 3 Jahre lang ein Benutzer von FreeBSD zu Hause (musste dann zurück zu Windows), und ich hatte noch nie viel Glück mit Linux. Und jetzt muss ich Software für Linux entwickeln. Ich brauche einen Plan.

Unter Windows können Sie nur eine Programmiersprache, eine API, gegen die Sie codieren, Ihr IDE (VisualStudio) und einige sehr grundlegende Tools zur Fehlerbehebung (Depends, ProcessExplorer, DebugView, WinDbg). Alles andere kommt natürlich.

Unter Linux ist das eine ganz andere Geschichte. Wie zum Teufel würde ich wissen, was DLL (sorry, Shared Object) laden würde, wenn ich vom Firefox-Plugin aus darauf verlinke? Was ist das Linux-Äquivalent zum Einfügen von __asm ​​int 3/DebugBreak () in das Quelle und Ausführung des Programms, und dann das Betriebssystem einen Debugger aufrufen lassen? Warum verwenden die Höllen-Release-Builds etwas, das als appLoader bezeichnet wird, während Debug-Builds irgendwie anders funktionieren? Das Schlimmste von allem: Wie wird eine Linux-Entwicklungsumgebung bereitgestellt?

Was würden Sie empfehlen, wenn man bedenkt, dass Hass normalerweise damit verbunden ist, nicht genug zu wissen? Ich bin in Ordnung mit Emacs und GCC. Ich muss mich als Linux-Administrator/Benutzer ausbilden und die richtigen Tools zur Fehlerbehebung (strace is cool, übrigens) erlernen, die den oben genannten entsprechen.

Muss ich Linux von Grund auf neu machen? Oder muss ich nur einige Bücher lesen (ich habe "UNIX-Programmierumgebung" von Kernighan und "Advanced Programming ..." von Stevens gelesen, aber ich muss etwas Praktischeres lernen)? Oder muss ich eine Linux-Distribution auf meinem Heimcomputer haben?

57
rincewind

Vielleicht finden Sie den Artikel Dynamic Linking unter Linux und Windows interessant, in dem erklärt wird, wie jedes Betriebssystem dynamische Verknüpfungen ausführt. Der Artikel Shared Library Search Paths erklärt, wie die Bibliotheken gefunden werden. Auch statische, gemeinsam genutzte dynamische und ladbare Linux-Bibliotheken ist sehr gut. Das Schöne an Linux-Bibliotheken ist, dass sie die Versionierung besser unterstützen und mehrere Versionen einer Bibliothek haben als Windows (AFAIK, ich mache kein Windows). Siehe dazu Versionierung der Bibliotheksschnittstelle in Solaris und Linux . Diese Artikel sollten Sie wirklich mit Bibliotheken abdecken.

Die GDB ist sehr mächtig, eine gute Einführung ist wahrscheinlich RMS's gdb Tutorial . Möglicherweise möchten Sie sich über bedingte Haltepunkte informieren. Entsprechungen zu __asm(int 3) finden Sie in der Frage Haltepunkt in C- oder C++ - Code programmgesteuert für gdb unter Linux setzen .

Das Buch Advanced Unix Programming von Marc Rochkind ist meiner Meinung nach ein Muss. Hat viele Beispiele und deckt alle POSIX/SUS-Themen auf sehr gut erläuterte Weise ab. Es ist das beste Buch zu diesem Thema, das ich bisher gelesen habe.

Aber um Ihnen das Leben zu erleichtern, empfehle ich Ihnen, eine Highlevel-API zu verwenden, die Dinge wie Qt für Sie abstrahiert. Erleichtert auch das plattformübergreifende Schreiben erheblich.

Wenn Sie Linux von Grund auf neu ausführen, können Sie besser verstehen, wie ein Linux-System aufgebaut ist, aber ich denke, dass es Ihr Wissen darüber aus Entwicklersicht nicht wesentlich verbessert. Es macht Sie jedoch mit Linux komfortabler, da Sie lernen, welche Teile in einer Linux-Umgebung vorhanden sind (und teilweise auch warum ). Ein Linux wird für Sie keine große Blackbox sein, nachdem Sie Linux From Scratch durchgearbeitet haben.

62
DarkDust

Wenn Sie strace mögen, vergessen Sie nicht ltrace : das Äquivalent für Bibliotheksaufrufe.
Auch ja, ich empfehle Linux From Scratch . Es ist eine gute Übung, um die Kernelemente des Betriebssystems zu erarbeiten und wie sie zusammenpassen.
Für eine moderne, vollständige Referenzbehandlung zur Systemprogrammierung würde ich empfehlen, The Linux Programming Interface zu verwenden.

16
entropo

Der Mac OS X ist wie ein Mercedes; Es ist das schönste und sauberste, aber es kostet viel. Windows ist wie ein Toyota; es wird dich hin und zurück bringen.

Linux ist wie ein Hot Rod; Es ist Sache der Menschen, sich zu vertiefen und wieder zusammenzusetzen. Linux ist nichts für jemanden, der nur den Computer benutzen möchte. Es ist für Leute, die Computer lieben. Leute, die Computer nicht lieben, sollten sich davon fernhalten.

Das, was Sie in Windows gelernt haben, lässt sich nicht gut übersetzen, nein. Aber Sie können die Einbauten sehen und den Motor laufen sehen.

Versuchen Sie, Linux als neues Spielzeug zu nehmen, mit dem Sie spielen und in das Sie kriechen können, um zu sehen, was los ist. Dinge, die unter Windows einfach sind, sind unter Linux schwieriger. Dinge, die unter Windows unmöglich sind, sind unter Linux möglich.

Wenn Sie Computer lieben, können Sie Linux lieben. Wenn Sie Computer nicht lieben, warum programmieren Sie überhaupt?

12
Andy Canfield

Wie wäre es, wenn Sie sich mit Monodevelop auf Mono entwickeln? Auf diese Weise können Sie ganz einfach loslegen, indem Sie Ihre Erfahrung in .NET wiederverwenden.

9
Johann Blais

Es ist entmutigend, wenn man es von Anfang an betrachtet (genau wie wenn man ein Linux-Entwickler wäre, der mit der Windows-Entwicklung beauftragt ist). Ich würde dieses eine Problem nach dem anderen angehen.

  • Holen Sie sich zuerst Ihr Umgebungssetup (Compiler, IDE - ja, sie existieren, Netbeans/Eclipse usw.)
  • Als nächstes installieren Sie die übergeordneten APIs (Boost/Qt usw.)
  • Beginnen Sie langsam, wenn es ein sofort zu lösendes Problem gibt, lassen Sie den Code kompilieren (oder schreiben Sie von Grund auf neu usw.). Wie bei jedem Entwicklungsprojekt sollten Sie die Dinge, die Sie kennen, zuerst zum Laufen bringen (dh Dinge, die kein Betriebssystem benötigen) Interaktion), und wenn Sie dann auf eine Suche stoßen, bin ich sicher, dass jemand da draußen zuvor auf dasselbe Problem gestoßen ist und es gelöst hat.

Lassen Sie vor allem alle Ihre subjektiven Meinungen an der Tür. Und nein, Sie müssen kein Guru sein, um sich unter Linux zu entwickeln. Ich weiß genug, um herumzukommen, und nicht alles - aber ich fühle mich damit wohl ...

8
Nim

Ich denke, Sie haben Ihre Frage in der Frage beantwortet:

"Unter Windows müssen Sie nur eine Programmiersprache, eine API, gegen die Sie codieren, Ihr IDE (VisualStudio) und einige sehr grundlegende Tools zur Fehlerbehebung (Depends, ProcessExplorer, DebugView) kennen , WinDbg). Alles andere kommt natürlich. "

Ratet mal, unter Linux können Sie nur eine Programmiersprache, eine API (oder ein paar), Ihre IDE (Eclipse oder NetBeans, sogar Geany, Emacs oder vim) kennen, wenn Sie wie) und einige grundlegende Tools zur Fehlerbehebung (GDB, Tracing-Tools, Lint, HTTP, PS).

Sie haben viel Wissen in das Windows-Programmier-Ökosystem investiert. Vieles davon ist (hoffentlich) abstraktes Wissen (was ist ein Compiler, ein Debugger, eine gemeinsam genutzte Bibliothek, ein Prozess, ein Thread? Was machen sie?), Das sich leicht übersetzen lässt, sobald Sie mit den verschiedenen Tools vertraut sind. Einige sind domänenspezifisch (Was DLL ist verknüpft, wenn ich einem Projekt X hinzufüge?), Aber selbst das Wechseln von einer Sprachklasse zu einer anderen innerhalb von Windows würde neues Lernen erfordern.

Installieren Sie Ubuntu oder Fedora in einer VM, lesen Sie einige C++ Hello World in Eclipse- oder NetBeans-Tutorials und einige Debugging-Programme in Eclipse/NetBeans-Tutorials und lassen Sie die natürliche Anpassungsfähigkeit Ihres Gehirns übernehmen. Es übersetzt Ideen für Sie, wenn Sie sich entspannen und es einfach umsetzen.

6
Justin

The success or failure of many thing in life comes down to our attitude, looking for positives and keeping your mind focused on the positives will do more to adide you as you start down this new interesting adventure.

Wie lange haben Sie gebraucht, um in einer Windows-Umgebung zu arbeiten? Man könnte sagen, es war einfach, dass Sie gerade erst angefangen haben. Aber vorher hatten Sie einige Jahre mit Fenstern gearbeitet. Wie lange haben Sie Windows verwendet, bevor Sie Ihr erstes Programm geschrieben haben? Es waren 8 Jahre für mich, obwohl ich jetzt fast ausschließlich seit 5 Jahren Linux benutze. Ich beherrsche Linux jetzt besser als Windows. Sie sollten sich mindestens so viel Zeit geben, um sich mit einem neuen System vertraut zu machen.

Beginnen Sie mit der Liste der Anwendungen, mit denen Sie in Windows nicht leben können, und suchen Sie nach Alternativen in der * nix-Welt. http://alternativeto.net/ und die Wikipedia weiterführende Abschnitte können hier hilfreich sein.

Hier ist eine Liste alternativer Software, die sich als sehr nützlich erweisen könnte. Hier sind einige Alternativen zu den Dingen, die Sie erwähnt haben.

Andere nützliche Ressourcen beim Wechsel von einem System zu einem anderen

Werfen Sie einen Blick auf diese Ressourcen, um ein besserer Power-User oder Administrator zu werden

Es hört sich auch so an, als wäre es eine Weile her, seit Sie sich die * nix-Welt angesehen haben. Ich würde einige der neuen Distributionen von Fedora , suse , debian oder meinem bevorzugten Arbeitsplatz bunt empfehlen .

Sie können jetzt wahrscheinlich davonkommen, wenn Sie die Interna des Systems und nur die Grundlagen wie in Windows nicht kennen. Ich würde nicht nur versuchen, mit dem Minimum davonzukommen. Wenn Sie Linux als ein Tool sehen, das Sie tatsächlich bei Ihrer Entwicklung unterstützt, und nicht nur als Betriebssystem, in dem Sie es entwickeln, wäre es hilfreich.

Linux From Scratch ist viel wichtiger, wenn Sie speziell für Linux entwickeln. Dies ist ein sehr spezifischer und technischer Sinn. I.E. Sie möchten für den Kernel oder den Port, den Sie programmieren, auf einen Supercomputer unter Linux entwickeln. Es wäre trotzdem sehr nützlich. Ich denke, Sie könnten das wahrscheinlich für ein paar Monate belassen, während Sie nur versuchen, in Ubuntu loszulegen. Ubuntu wird so nah an der Sache sein, die einfach funktioniert Welt von Mac und Windows.

6
nelaaro

Ich habe Unix im Allgemeinen durch Lesen der Manpages gelernt. Sie sollten sie zumindest überfliegen. Ja, ich meine alle. Die Methode, mit der ich in die Manpage-Verzeichnisse cd und sie abschnittsweise angreife.

Ich benutze das:

for i in *; do f=`basename $i .gz`; man `basename $f .1` ; done

... Ersetzen Sie . 1 durch die Nummer des Abschnitts, den Sie lesen, .2, .3 usw. Drücken Sie Strg-Z Strg-C, um die Schleife zu verlassen. Ihr Kilometerstand kann variieren, wenn Ihre Linux-Distribution die Dinge anders speichert, d. H. Nicht als cmdname.1.gz.

Gehen Sie einfach die Beschreibungen durch und mehr, wenn es etwas Interessantes ist. Die Abschnitte 1, 2 und 3 sind für einen Programmierer am wichtigsten. 1 behandelt allgemeine Benutzerbefehle, einschließlich Ihrer Kompilierungswerkzeuge, und verschiedene forensische Dienstprogramme. 2 sind Systemaufrufe und 3 sind Bibliotheksaufrufe.

3
Hack Saw

Zwingen Sie sich nicht dazu, etwas zu tun, das Sie nicht mögen. Verwenden Sie Windows als Entwicklungsumgebung, schreiben Sie einen portablen Code, kompilieren Sie ihn für Linux und testen Sie ihn nur gelegentlich in einer VM.

3
SK-logic

Ich war einer von zwei, die mit etwas Ähnlichem, aber anderem beauftragt waren. Ich arbeite in einem K-12-Schulbezirk und das Geschäftssystem (HR, Finanzen usw.) wird von einer HP3000/TurboImage-Datenbank auf eine Linux/MS SQL-Plattform migriert. Ich bin mit der MS SQL-Seite vertraut. Aber nicht die Linux-Seite. Wir sind beide auf der Administrationsseite, nicht auf der Programmierseite. Die Programmierung erfolgt im Freien - Business App von Drittanbietern für K-12-Organisationen.

Ich nahm an Wochenenden an einem 5-wöchigen Einführungskurs in Linux (Redhat) teil - meistens im Befehlszeilenmodus - und es war die Zeit für mich wert, um schnell in die Linux-Arbeitsweise einzusteigen. Offensichtlich YMMV je nach Klasse/Lehrer.

Sie haben "Das Schlimmste von allem: Wie wird eine Linux-Entwicklungsumgebung bereitgestellt?" Erwähnt. Da Sie mit Windows bereits sehr vertraut sind, würde ich Ihnen dringend empfehlen, eine Kopie von vmWare Workstation zu erwerben. Damit können Sie Windows als Workstation behalten und Linux als Gastsysteme installieren - löschen, spülen und nach Bedarf wiederholen. Wenn Sie ein gutes Setup erhalten, können Sie es meiner Meinung nach als Snapshot erstellen, aber ich kann nicht sicher sagen, welche Versionen den Snapshot-Aspekt unterstützen. Und wenn Sie sich für die vmWare Workstation entscheiden, um mehrere Entwicklungs-Setups zu aktivieren, sollten Sie den Speicher auf jeden Fall erweitern.

Es macht mir auch nichts aus, CentOS als Linux-Betriebssystem für die Gäste zu empfehlen. Soweit ich weiß, ist es wie bei RedHat ohne die Kosten für Branding und/oder Verkaufsgespräch und/oder Support. Ich bin mit den anderen Linux-Varianten nicht vertraut und kann daher keine Eingaben dazu machen.

Greg

2
Gregory Thomson

Ich bin mir nicht sicher, ob es für Plattformen funktioniert, aber für Programmiersprachen. Ich fand es hilfreich, darüber nachzudenken, wie ich mich mit denen vertraut gemacht und vertraut gemacht habe, in denen ich gut bin, und zu versuchen, diese Erfahrungen und Aktivitäten für das, was ich bin, wiederzugeben. Ich versuche zu lernen.

Vielleicht etwas in dieser Richtung?

Generell ist mein Interesse und mein Vertrauen in GNU/Linux dadurch entstanden, dass es viel bastelbarer ist (und in den frühen Tagen gebastelt werden muss) als Windows. Ich musste mich mit vielen Dingen anlegen, um die Dinge zum Laufen zu bringen, und das half mir, viele Dinge zu lernen. Die Dinge sind jetzt viel besser, aber all diese Stunden haben geholfen.

2
Noufal Ibrahim

Bedenken Sie Folgendes: Sie wussten einmal nichts über Windows, aber Sie haben es gelernt und sich im Laufe der Zeit damit vertraut gemacht.

Dann änderte MS das Programmiersystem, mit dem Sie vertraut waren, auf .NET, und Sie wussten nichts mehr über DLLS, COM und was auch immer. Sie mussten Dinge wie Assemblys, GAC und App-Domänen lernen. Du hast das ok gelernt.

Warum machen Sie sich jetzt Sorgen, dasselbe mit Linux zu tun?

Im Web gibt es eine Vielzahl von Tutorials für alle Arten von Programmierumgebungen. Jetzt sagst du GCC, also gehe ich von der C++ - Entwicklung aus. Holen Sie sich Eclipse, installieren Sie das CDT (c dev tools) auf Ihrer Eclipse-Plattform (Eclipse ist eine Mehrzweck-IDE, Sie können es für C++ verwenden , PHP, Java, was auch immer - aber Sie müssen das Tool für Ihre Sprache installieren, da Sie nicht wirklich möchten, dass alles wie VS vorinstalliert ist und die Installation 3 Tage dauert :))

Überall im Web gibt es benutzerfreundliche Tutorials. IBM hat hier eine das ist ziemlich umfassend.

Debugging-Tools ... Eclipse hat es eingebettet ( Tutorial ), aber Sie können viele Tools wie die von Ihnen erwähnten finden. Suchen Sie einfach im Internet und Sie werden viele Optionen finden. Es wird eine Weile dauern, bis Sie herausgefunden haben, wie ein Core-Dump gelesen wird (im Gegensatz zu beispielsweise einem Windows-User-Dump), aber Sie werden es schaffen.

Es kann sich auch lohnen, ein Blog mit Ihren Erfahrungen zu starten. Dadurch können Sie sich nicht nur daran erinnern, was Sie getan haben (z. B. Eclipse so einrichten, wie es Ihnen gefällt, sondern auch vergessen, wann Sie es in einem erneut ausführen müssen Jahreszeit), aber es wird anderen in Ihrer Situation helfen.

1
gbjbaanb

Ich mag beide Plattformen und trotz aller Unterschiede in der Benutzeroberfläche und im Entwickler-Ökosystem finde ich sie im Cover eher ähnlich als unterschiedlich. Tatsächlich können Sie für die meisten Windows-Konzepte gleichwertige Linux-Konzepte finden, indem Sie einfach im Internet suchen.

Trotzdem empfehle ich dringend, zu lernen, wie man Dinge auf "Unix-Weise" macht. Verwenden Sie die Befehlszeile anstelle der fehlerhaften GUI-Frontends (ich spreche hier hauptsächlich von GDB). Suchen Sie nicht nach einer IDE und lernen Sie stattdessen, wie Sie eine Reihe spezialisierter Tools verwenden. Wählen Sie einen guten Editor (zeigt auf vim) und lernen Sie ihn gut. Lesen Sie, wie make funktioniert, auch wenn Sie nicht vorhaben, Experte zu werden. Vielleicht magst du sogar Linux. Es ist geek-freundlich und macht Spaß, damit zu spielen.

1

Ich glaube nicht, dass Sie Linux von Grund auf neu machen müssen. Wenn ich du wäre, würde ich mich für Ubuntu entscheiden. Es ist komfortabler und basiert auf Debian. Es steht reichlich technisches Material zur Verfügung.

Wenn Sie mehr in Linux eintauchen möchten, ist Gentoo eine gute Option. Es erfordert, dass Sie viel über Konfiguration und Kernel lesen, aber es gibt Ihnen auch ein ziemlich funktionierendes System, um in af zu arbeiten

0
anders.norgaard

Die erste Frage, die ich stellen möchte, ist, was Sie entwickeln möchten. Wenn es sich um eine GUI-basierte Anwendung handelt, kann dies anders sein, als wenn Sie so etwas wie eine Kernel-Erweiterung schreiben müssen.

Im Fall einer GUI-App ist es für mich am einfachsten, Qt zu verwenden, das über eine eigene Entwicklungsumgebung (Qt-Creator) verfügt und plattformübergreifend nur eine API erlernt, die für Windows/Linux verwendet werden kann/OSX und sogar mobile Entwicklung. Wie in Visual Studio unter Windows oder XCode unter OSX können Sie Fenster und Elemente in einem grafischen Editor erstellen und gestalten. Die API lässt sich mit zahlreichen Beispielanwendungen sehr einfach abrufen.

Wenn Sie mehr Low-Level benötigen, können Sie, sobald Sie sich in der Befehlszeile mit Linux auskennen, Verzeichnisse durchlaufen, Dateien bearbeiten, Berechtigungen verstehen usw., und entweder lesen, wie Sie ein einfaches Programm mit gcc kompilieren. wie man Dateien verknüpft und die ausführbare Datei ausführt und wie man dann mit gdb debuggt.

Wenn dies ein wenig entmutigend erscheint, können Sie alternativ Eclipse oder eine andere IDE herunterladen, aber Sie werden sich auf lange Sicht wahrscheinlich viel besser mit Linux vertraut machen, wenn Sie zuerst Zeit und Mühe in die Befehlszeile stecken.

0
TheDarkKnight

Google "Die Kunst der Unix-Programmierung" und lesen Sie es. IMO, Ihre Hauptschwierigkeit ist die unterschiedliche Philosophie, und dieses Buch ist eine ausgezeichnete Lektüre dafür.

Außerdem werden einige nicht offensichtliche, aber technisch sehr wichtige Unterschiede zwischen * n * x- und Windows-Systemen vorgestellt. Dies ist der Schlüssel zum Verständnis, warum es unter Linux sinnvoll ist, Dinge anders zu machen.

0
user59625