Lehrbuch zum Netzwerk-Simulator ns-3. Kapitel 3

Lehrbuch zum Netzwerk-Simulator ns-3. Kapitel 3
Kapitel 1,2

3 Einstieg in die Arbeit
3.1 Übersicht
3.2 Voraussetzungen
3.2.1 Herunterladen des ns-3 Releases als Quellarchiv
3.3 ns-3 mit Git herunterladen
3.3.1 ns-3 mit Bake herunterladen
3.4 ns-3 kompilieren
3.4.1 Kompilierung mit build.py
3.4.2 Kompilierung mit Bake
3.4.3 Kompilierung mit Waf
3.5 ns-3 testen
3.6 Skript ausführen
3.6.1 Befehlszeilenargumente
3.6.2 Debugging
3.6.3 Arbeitsverzeichnis

Kapitel 3

Einstieg in die Arbeit

Dieses Kapitel soll den Leser darauf vorbereiten, mit einem Computer zu arbeiten, auf dem möglicherweise nie ns-3 installiert wurde. Die Darstellung umfasst unterstützte Plattformen, Voraussetzungen, Methoden zum Erhalt von ns-3, Kompilierungsarten für ns-3 und Möglichkeiten zur Überprüfung Ihrer Kompilierung sowie zum Ausführen einfacher Programme.

3.1 Übersicht

Der Simulator ns-3 ist als System von zusammenarbeitenden Softwarebibliotheken aufgebaut. Bei der Kompilierung wird der Code benutzerdefinierter Programme mit diesen Bibliotheken verbunden. Für das Schreiben benutzerdefinierter Programme werden die Programmiersprachen C++ oder Python verwendet.

ns-3 wird als Quellcode verbreitet, das bedeutet, dass das Zielsystem eine Software-Entwicklungsumgebung benötigt, um zunächst die Bibliotheken zu kompilieren und dann das benutzerdefinierte Programm. Grundsätzlich kann ns-3 als vorgefertigte Bibliotheken für ein spezifisches System vertrieben werden, und in Zukunft könnten sie auf diese Weise verteilt werden. Derzeit führen jedoch viele Benutzer ihre Arbeiten durch, indem sie ns-3 selbst bearbeiten, daher ist es nützlich, über den Quellcode zur Kompilierung der Bibliotheken zu verfügen. Wer die Aufgabe übernehmen möchte, vorgefertigte Bibliotheken und Pakete für Betriebssysteme zu erstellen, wird gebeten, sich mit der Mailingliste in Verbindung zu setzen. ns-developers.

Wir werden drei Möglichkeiten betrachten, um ns-3 herunterzuladen und zu kompilieren. Die erste besteht darin, das offizielle Release von der Hauptseite herunterzuladen und zu bauen. Die zweite ist die Auswahl und Kompilierung von Entwicklungsvarianten der Grundinstallation von ns-3. Die dritte Verwendung zusätzlicher Kompilierungswerkzeuge, um mehr Erweiterungen für ns-3 herunterzuladen. Wir werden jede dieser Methoden durchgehen, da sich die Werkzeuge etwas unterscheiden.

Erfahrene Linux-Benutzer fragen sich möglicherweise, warum ns-3 nicht als Paket bereitgestellt wird, wie die meisten anderen Bibliotheken, die Paketmanager verwenden. Obwohl es binäre Pakete für verschiedene Linux-Distributionen (z. B. Debian) gibt, bearbeiten die meisten Benutzer letztlich die Bibliotheken und müssen ns-3 selbst neu kompilieren, weshalb der Zugriff auf den Quellcode praktisch ist. Aus diesem Grund werden wir uns mit der Installation aus dem Quellcode befassen.

Für die meisten Anwendungen benötigt ns-3 keine speziellen Rechte, es wird empfohlen, ein nicht privilegiertes Benutzerkonto zu verwenden. root Der gesamte Satz an verfügbaren ns-3-Bibliotheken hat eine Reihe von Abhängigkeiten von Drittanbieterbibliotheken, aber größtenteils kann ns-3 mit Unterstützung für mehrere gängige (häufig standardmäßig installierte) Komponenten kompiliert und verwendet werden: C++-Compiler, Python, Code-Editor (z. B.

3.2 Voraussetzungen

vim emacs, Eclipse oder ) und, wenn Entwicklungsspeicherorte verwendet werden, Versionskontrollsysteme wie Git. Die meisten neuen Benutzer müssen sich keine Sorgen machen, wenn ihre Konfiguration auf einige fehlende zusätzliche Funktionen von ns-3 hinweist, aber für diejenigen, die eine vollständige Installation wünschen, stellt das Projekt ein Wiki bereit, das Seiten mit vielen nützlichen Tipps und Ratschlägen enthält. Eine solche Seite ist die Seite "Installation" mit Installationsanweisungen für verschiedene Systeme, die unter folgender Adresse verfügbar sind:Der Abschnitt "Voraussetzungen" auf dieser Wiki-Seite erklärt, welche Pakete erforderlich sind, um die allgemeinen Optionen von ns-3 zu unterstützen, und bietet die Befehle zum Installieren dieser Pakete in gängigen Linux- oder macOS-Varianten. https://www.nsnam.org/wiki/Installation.

Sie können die Möglichkeit nutzen, die ns-3-Wiki-Seite oder die Hauptwebsite zu erkunden:

, da dort viele Informationen vorhanden sind. Beginnend mit der letzten Version von ns-3 (ns-3.29) sind folgende Werkzeuge erforderlich, um ns-3 auszuführen: https://www.nsnam.orgWerkzeug Paket/version

C++-Compiler

  • clang++ oder g++ (g++ Version 4.9 oder höher)
    python2 Version >= 2.7.10 oder python3 Version >=3.4
  • Python
    jede aktuelle Version (für den Zugriff auf ns-3 auf GitLab.com)
  • Git
    jede aktuelle Version (zum Entpacken der ns-3-Version)
  • tar
    bunzip2
  • jede aktuelle Version (zum Entpacken der ns-3-Version)
    Um die standardmäßig installierte Python-Version zu überprüfen, geben Sie ein:

python -V python -V. Um die Version von g++ zu überprüfen, geben Sie ein g++ -v. Wenn einige Werkzeuge fehlen oder zu alt sind, konsultieren Sie das Installationshandbuch auf der ns‑3-Wiki-Seite.

Ab diesem Punkt gehen wir davon aus, dass der Leser auf Linux, MacOS oder einem Linux-Emulator arbeitet und zumindest die oben genannten Werkzeuge hat.

3.2.1 Herunterladen des ns-3 Releases als Quellarchiv

Dies ist die Vorgehensweise für einen neuen Benutzer, der die neuesten Release- und Paketversionen von ns‑3 herunterladen und ausprobieren möchte. Die ns‑3-Releases werden in Form von komprimierten Quellarchiven veröffentlicht, die manchmal als tarball. tarball bezeichnet werden — ein spezielles Format für Softwarearchive, in dem mehrere Dateien zusammengefasst sind. Das Archiv ist normalerweise komprimiert. Der Download von ns‑3 ist tarball einfach, Sie müssen nur das Release auswählen, es herunterladen und entpacken.

Angenommen, Sie möchten als Benutzer ns‑3 in einem lokalen Verzeichnis mit dem Namen workspace. Sie können eine Arbeitskopie des Releases erhalten, indem Sie in der Linux-Konsole Folgendes eingeben (natürlich ersetzen Sie die entsprechenden Versionsnummern)

$ cd 
$ mkdir workspace 
$ cd workspace 
$ wget https://www.nsnam.org/release/ns-allinone-3.29.tar.bz2 
$ tar xjf ns-allinone-3.29.tar.bz2 

Beachten Sie das oben verwendete Hilfsprogramm wget, das ein Befehlszeilentool zum Herunterladen von Objekten aus dem Internet ist. Wenn Sie es nicht installiert haben, können Sie dafür auch den Browser verwenden.

Wenn Sie diesen Schritten folgen, gelangen Sie in das Verzeichnis ns-allinone-3.29, wo Sie mehrere Dateien und Verzeichnisse sehen sollten.

$ cd ns-allinone-3.29
$ ls
bake constants.py ns-3.29 README
build.py netanim-3.108 pybindgen-0.17.0.post58+ngcf00cc0 util.py

Jetzt sind Sie bereit, das Basisdistribution von ns‑3 zu erstellen, und können zum Abschnitt über das Erstellen von ns‑3 wechseln.

3.3 ns-3 mit Git herunterladen

Der ns‑3-Code ist in den Git-Repositories auf GitLab.com unter folgender Adresse verfügbar https://gitlab.com/nsnam/. Die Gruppe nsnam vereint verschiedene Repositories, die im Open-Source-Projekt verwendet werden.

Der einfachste Weg, um mit den Git-Repositories zu beginnen, besteht darin, ein Fork zu erstellen oder das ns‑3-allinonezu klonen. Dies ist eine Sammlung von Skripten, die das Herunterladen und Erstellen der am häufigsten verwendeten ns‑3-Subsysteme verwaltet. Wenn Sie neu bei Git sind, sind die Begriffe "Fork" und "Klonen" möglicherweise nicht vertraut; wenn dem so ist, empfehlen wir Ihnen einfach, das Repository auf GitLab.com zu klonen (eine eigene Kopie zu erstellen) folgendermaßen:

$ cd 
$ mkdir workspace 
$ cd workspace 
$ git clone https://gitlab.com/nsnam/ns-3-allinone.git 
$ cd ns-3-allinone 

An diesem Punkt sehen Sie das Verzeichnis ns‑3-allinone unterscheidet sich geringfügig von dem oben beschriebenen Verzeichnis mit dem Release-Archiv. Es sollte ungefähr so aussehen:

$ ls
build.py constants.py download.py README util.py

Achten Sie auf das Vorhandensein des Skripts download.py, das zusätzlich ns-3 und den dazugehörigen Quellcode extrahiert. Hier haben Sie die Wahl: entweder die neueste Entwicklungs-Snapshot von ns-3 herunterzuladen:

$ python download.py

oder bevorzugen Sie das Release von ns-3, indem Sie das Flag -n verwenden, um die Release-Nummer anzugeben:

$ python download.py -n ns-3.29

Nach diesem Schritt werden zusätzliche Repositories in das Verzeichnis ns‑3-allinone heruntergeladen: ns-3, bake, pybindgen und netanim.

Hinweis
Auf einer Maschine mit reinem Ubuntu 16.04 musste ich den Befehl wie folgt ändern: $ sudo python3 download.py -n ns-3.29 (hier und im Folgenden die Anmerkungen des Übersetzers).

3.3.1 ns-3 mit Bake herunterladen

Die beiden oben genannten Methoden (Archiv des Quellcodes oder Repository ns‑3-allinone über Git) sind nützlich, um eine möglichst einfache Installation von ns-3 mit einigen Add-ons zu erhalten (pybindgen zur Generierung von Python-Bindungen und netanim zur Animation von Netzwerken). Das dritte Repository, das standardmäßig in ns-3-allinone bereitgestellt wird, heißt bake.

Bake — ein Werkzeug zur koordinierten Erstellung von Software aus mehreren Repositories, das für das ns-3-Projekt entwickelt wurde. Bake kann verwendet werden, um Entwickler-Versionen von ns-3 zu erhalten sowie um Erweiterungen der Basisversion des ns-3-Distributionspakets herunterzuladen und zu bauen, wie z.B. die Umgebung Direct Code Execution, CradleNetwork Simulation Cradle, die Möglichkeit, neue Python-Bindungen zu erstellen, und verschiedene „Anwendungen“ von ns-3.

Hinweis
CradleNetwork Simulation Cradle ist ein Framework, das es ermöglicht, innerhalb des Netzwerksimulators echte Netzwerk-Stacks TCP/IP zu verwenden.

Wenn Sie annehmen, dass Ihre ns-3-Installation erweiterte oder zusätzliche Funktionen haben sollte, können Sie diesen Installationsweg folgen.

In den letzten Releases von ns-3 Bake wurde der tar-Release. Im Release ist eine Konfigurationsdatei enthalten, die es ermöglicht, die zum Zeitpunkt der Erstellung des Releases aktuellen Versionen der Software herunterzuladen. Das heißt, zum Beispiel die Version Bake, die mit dem Release von ns-3.29 herausgegeben wird, kann verwendet werden, um Komponenten für dieses ns-3-Release oder frühere zu erhalten, darf jedoch nicht verwendet werden, um Komponenten für spätere Releases zu extrahieren (es sei denn, die Paketbeschreibung bakeconf.xml wurde aktualisiert).

Sie können auch die aktuellste Kopie erhalten bake, indem Sie den folgenden Befehl in Ihre Linux-Konsole eingeben (vorausgesetzt, Sie haben Git installiert):

$ cd 
$ mkdir workspace 
$ cd workspace 
$ git clone https://gitlab.com/nsnam/bake.git

Während der Ausführung des Befehls git sollten Sie etwas Ähnliches sehen:

Cloning into 'bake'...
remote: Enumerating objects: 2086, done. 
remote: Counting objects: 100% (2086/2086), done. 
remote: Compressing objects: 100% (649/649), done. 
remote: Total 2086 (delta 1404), reused 2078 (delta 1399) 
Receiving objects: 100% (2086/2086), 2.68 MiB | 3.82 MiB/s, done. 
Resolving deltas: 100% (1404/1404), done.

Nach Abschluss des Befehls clone sollten Sie ein Verzeichnis mit dem Namen bakesehen, dessen Inhalt ungefähr so aussehen sollte:

$ cd bake
$ ls
bake bakeconf.xml bake.py doc examples generate-binary.py test TODO

Bitte beachten Sie, dass Sie mehrere Python-Skripte, ein Python-Modul namens bake und eine XML-Konfigurationsdatei heruntergeladen haben. Der nächste Schritt besteht darin, diese Skripte zu verwenden, um das ns-3-Paket Ihrer Wahl herunterzuladen und zu erstellen. Es gibt mehrere Konfigurationsziele:

  1. ns-3.29: ein Modul, das der Veröffentlichung entspricht; es wird Komponenten herunterladen, die der Veröffentlichung im Tarball ähnlich sind;

  2. ns-3-dev: ein ähnliches Modul, aber mit Code aus dem Entwicklungssystem;

  3. ns-allinone-3.29: ein Modul, das zusätzliche Funktionen wie Click-Routing und Network Simulation Cradle, Openflow für ns-3 beinhaltet.

  4. ns‑3-allinone: ähnlich der Release-Version des Moduls allinone, jedoch für den Entwicklungscode.

Hinweis
Click — eine modulare Softwarearchitektur zur Erstellung von Routern.

Openflow ist ein Protokoll zur Verwaltung des Datenverarbeitungsprozesses, der Daten über Netze von Routern und Switches überträgt, und implementiert die Technologie des softwarekonfigurierten Netzwerks.

Der aktuelle Entwicklungs-Snapshot (nicht veröffentlicht) von ns-3 ist zu finden unter:https://gitlab.com/nsnam/ns-3-dev.git.

Die Entwickler bemühen sich, diese Repositories in einem konsistenten Arbeitszustand zu halten, aber sie befinden sich im Entwicklungsbereich und enthalten nicht veröffentlichten Code, daher sollten Sie, wenn Sie keine neuen Funktionen nutzen möchten, die offizielle Veröffentlichung wählen.

Sie finden die neueste Version des Codes, indem Sie die Liste der Repositories durchsuchen oder auf die Webseite „ns-3 Releases“ gehen:https://www.nsnam.org/releases/ und auf den Link zur neuesten Version klicken. In diesem Beispiel fahren wir mit ns-3.29 fort.

Um nun die notwendigen Komponenten von ns-3 zu erhalten, verwenden wir das Tool Bake. Lassen Sie uns ein paar einleitende Worte zur Funktionsweise sagen. Bake.

Bake funktioniert, indem es die Quellcodes der Pakete in das Verzeichnis source lädt und die Bibliotheken in das Build-Verzeichnis installiert. Bake kann gestartet werden, indem auf die Binärdatei verwiesen wird, aber wenn Sie möchten, dass Bake nicht aus dem Verzeichnis, in das er hochgeladen wurde, fügen Sie bitte den Pfad zu bake Ihrem Pfad (Umgebungsvariable PATH) hinzu, zum Beispiel wie folgt (Beispiel für die Linux-Bash-Shell). Wechseln Sie in das Verzeichnis „bake“ und setzen Sie dann die folgenden Umgebungsvariablen:

$ export BAKE_HOME=`pwd` 
$ export PATH=$PATH:$BAKE_HOME:$BAKE_HOME/build/bin 
$ export PYTHONPATH=$PYTHONPATH:$BAKE_HOME:$BAKE_HOME/build/lib

Dies wird das Programm bake.py in den Shell-Pfad setzen und es anderen Programmen ermöglichen, die ausführbaren Dateien und Bibliotheken zu finden, die erstellt wurden bake. In einigen Verwendungsfällen ist die oben beschriebene Einrichtung von PATH und PYTHONPATH nicht erforderlich, aber für eine vollständige Installation von ns-3-allinone (mit zusätzlichen Paketen) ist sie normalerweise notwendig. bakeGehen Sie in das Arbeitsverzeichnis und geben Sie in der Konsole Folgendes ein:

$ ./bake.py configure -e ns-3.29

Als Nächstes werden wir Sie bitten, zu überprüfen, ob wir die benötigten Werkzeuge zum Herunterladen der verschiedenen Komponenten haben. Geben Sie ein:

$ ./bake.py check Bake Sie sollten etwas sehen wie das Folgende:

> Python - OK 
> GNU C++ Compiler - OK 
> Mercurial - OK 
> Git - OK 
> Tar-Tool - OK 
> Unzip-Tool - OK 
> Make - OK 
> cMake - OK 
> Patch-Tool - OK 
> Gesuchter Pfad für Werkzeuge: /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin ...

Insbesondere sind die Download-Tools wie Mercurial, CVS, Git und Bazaar in diesem Schritt entscheidend, da sie es uns ermöglichen, den Code zu erhalten. Stellen Sie in diesem Schritt sicher, dass Sie die fehlenden Werkzeuge auf die übliche Weise für Ihr System installieren (wenn Sie können) oder wenden Sie sich an Ihren Systemadministrator.

Versuchen Sie weiter, die Software herunterzuladen:

$ ./bake.py download

Das Ergebnis sollte etwa so aussehen:

>> Suche nach Systemabhängigkeit setuptools - OK 
>> Suche nach Systemabhängigkeit libgoocanvas2 - OK 
>> Suche nach Systemabhängigkeit gi-cairo - OK 
>> Suche nach Systemabhängigkeit pygobject - OK 
>> Suche nach Systemabhängigkeit pygraphviz - OK 
>> Suche nach Systemabhängigkeit python-dev - OK 
>> Suche nach Systemabhängigkeit qt - OK 
>> Suche nach Systemabhängigkeit g++ - OK 
>> Herunterladen von pybindgen-0.19.0.post4+ng823d8b2 (Zieldirectory: pybindgen) - OK 
>> Herunterladen von netanim-3.108 - OK 
>> Herunterladen von ns-3.29 - OK

Das würde bedeuten, dass drei Quellpakete heruntergeladen wurden. Wechseln Sie nun in das Verzeichnis source und geben Sie ls ein; Sie sollten sehen:

$ cd source 
$ ls
netanim-3.108 ns-3.29 pybindgen

Jetzt sind Sie bereit, die ns-3 Distribution zu erstellen.

Wie beim Herunterladen von ns-3 gibt es mehrere Möglichkeiten, ns-3 zu erstellen. Das Wichtigste ist, dass wir betonen möchten, dass ns-3 mit einem Werkzeug namens

Waf

3.4 ns-3 kompilieren

, das unten beschrieben wird, erstellt wird. Die meisten Benutzer werden damit arbeiten. Waf, wie unten beschrieben. Die meisten Benutzer werden damit arbeiten. Waf, aber es gibt mehrere nützliche Skripte, die Ihnen helfen können, zu beginnen oder komplexere Builds zu organisieren. Bitte lesen Sie daher zuerst über Waf, schauen Sie sich build.py und das Builden mit bake.

3.4.1 Kompilierung mit build.py

Achtung! Dieser Build-Schritt ist nur aus der oben beschriebenen Version des Quellarchivs verfügbar; nicht aus dem über git oder bake heruntergeladenen.

Beim Arbeiten mit dem Release-Archiv tarball, in ns‑3‑allinone gibt es ein nützliches Skript, das das Builden der Komponenten erleichtern kann. Es heißt build.py. Dieses Programm richtet das Projekt für Sie auf die nützlichste Weise ein. Beachten Sie jedoch, dass kompliziertere Einstellungen und die Arbeit mit ns‑3 in der Regel die Verwendung des eigenen Build-Systems von ns‑3, Waf, beinhalten, das später in diesem Handbuch vorgestellt wird.

Wenn Sie den Download mit tarball, sollte in Ihrem Verzeichnis ~\/workspace ein Verzeichnis mit einem Namen wie ns-allinone-3.29erstellt worden sein. Geben Sie Folgendes ein:

$ .\/build.py --enable-examples --enable-tests

Beim Aufruf von build.py haben wir Argumente für die Befehlszeile verwendet, um die in diesem Handbuch verwendeten Beispiele und Tests zu bauen, die in ns‑3 standardmäßig nicht kompiliert werden. Standardmäßig erstellt das Programm auch alle verfügbaren Module. Sie können ns‑3 später ohne Beispiele und Tests oder Module, die Sie für Ihre Arbeit nicht benötigen, bauen.

Sie werden viele Compiler-Ausgaben sehen, die vom Skript beim Kompilieren der verschiedenen von Ihnen heruntergeladenen Teile angezeigt werden. Zuerst versucht das Skript, den Animator zu kompilieren netanim, dann den Bindungs-Generator pybindgen und schließlich ns‑3. Am Ende des Prozesses sollten Sie Folgendes sehen:

Waf: Verlasse das Verzeichnis '\/path\/to\/workspace\/ns-allinone-3.29\/ns-3.29\/build'\n'build' wurde erfolgreich abgeschlossen (6m25.032s) \n\nModule gebaut:\nantenne                aodv                     anwendungen\nbrücke                 gebäude                 konfigurationsspeicher\nkern                   csma                     csma-layout\ndsdv                   dsr                      energie \nfd-net-device          flussmonitor             internet\ninternet-apps          lr-wpan                  lte\nmesh                   mobilität               mpi\nnetanim (kein Python)   netzwerk                 nix-vektor-routing \nolsr                   punkt-zu-punkt           punkt-zu-punkt-layout \nverbreitung            sixlowpan                spektrum \nstatistiken            tap-brücke               test (kein Python) \ntopologie-lesen        verkehrssteuerung      uan \nvirtuelles-netzwerkgerät visualizer               wellen \nwifi                   wimax \n\nNicht gebaute Module (siehe ns-3-Tutorial zur Erklärung):\nbrite                  click                    openflow \nVerlasse das Verzeichnis .\/ns-3.29

In den letzten drei Zeilen des Listings sehen wir eine Meldung über die Module, die nicht gebaut wurden:

Module nicht gebaut (siehe ns-3-Tutorial für Erklärungen):
brite                     click

Das bedeutet einfach, dass einige ns‑3-Module, die von externen Bibliotheken abhängen, möglicherweise nicht gebaut wurden, oder dass ihr Bau für diese Konfiguration nicht erforderlich ist. Das bedeutet nicht, dass der Simulator nicht gebaut wurde oder dass die gebauten Module fehlerhaft arbeiten werden.

3.4.2 Kompilierung mit Bake

Wenn Sie oben zur Abrufung des Quellcodes aus den Projektrepositorys bake verwendet haben, können Sie es weiterhin zum Bauen von ns‑3 verwenden. Geben Sie ein:

$ .\/bake.py build

und Sie sollten etwas sehen wie:

>> Building pybindgen-0.19.0.post4+ng823d8b2 - OK 
>> Building netanim-3.108 - OK 
>> Building ns-3.29 - OK

Hinweis: Sie können auch beide Schritte, das Herunterladen und das Bauen, gleichzeitig ausführen, indem Sie „bake.py deploy“ aufrufen.

Beim Bau aller Komponenten können Fehler auftreten, aber der Bau wird fortgesetzt, wenn die Komponente nicht erforderlich ist. Zum Beispiel gab es ein aktuelles Portierproblem, das darin bestand, dass castxml von dem Werkzeug bake nicht auf allen Plattformen gebaut werden kann. In diesem Fall wird eine Nachricht ausgegeben wie:

>> Building castxml - Problem 
> Problem: Optionale Abhängigkeit, Modul "castxml" fehlgeschlagen
Dies kann die Funktionalität des Endbaus reduzieren.
Dennoch wird bake fortfahren, da "castxml" keine wesentliche Abhängigkeit ist.
Für weitere Informationen rufen Sie bake mit -v oder -vvv im vollen ausführlichen Modus auf.

scheint castxml ist nur erforderlich, wenn Sie aktualisierte Python-Bindungen erstellen möchten. Für die meisten Benutzer ist das nicht notwendig (zumindest bis sie ns‑3 ändern), sodass solche Warnungen vorübergehend sicher ignoriert werden können.

Wenn ein Fehler auftritt, gibt Ihnen der folgende Befehl einen Hinweis auf fehlende Abhängigkeiten:

$ .\/bake.py show

Es werden verschiedene Paketabhängigkeiten aufgelistet, die Sie zu bauen versuchen.

3.4.3 Kompilierung mit Waf

Bis zu diesem Zeitpunkt haben wir entweder das Script build.py, oder das Tool bake. Diese Werkzeuge sind nützlich, um ns‑3 zu bauen und Bibliotheken zu verwalten. Tatsächlich starten sie zum Bauen das Build-Werkzeug Waf aus dem Verzeichnis ns‑3. Waf wird zusammen mit dem Quellcode von ns‑3 installiert. Die meisten Benutzer wechseln schnell zu einer direkten Nutzung Waf. Bitte wechseln Sie also zum ns‑3-Verzeichnis, das Sie ursprünglich erstellt haben.

Zurzeit ist es nicht zwingend erforderlich, aber es wäre nützlich, einen kurzen Ausblick zu geben und zu zeigen, wie man Änderungen an der Projektkonfiguration vornimmt. Wahrscheinlich ist die nützlichste Änderung der Konfiguration, die Sie vornehmen können, die Erstellung einer optimierten Version des Codes. Standardmäßig haben Sie Ihr Projekt für den Bau einer Debug-Version konfiguriert. Lassen Sie uns das Projekt für die Erstellung einer optimierten Version betrachten. Um Waf zu erklären, dass er optimierte Versionen mit Beispielen und Tests erstellen soll, müssen Sie die folgenden Befehle ausführen:

$ ./waf clean 
$ ./waf configure --build-profile=optimized --enable-examples --enable-tests

Dies wird Waf außerhalb des lokalen Verzeichnisses ausgeführt (zu Ihrem Komfort). Der erste Befehl führt eine Bereinigung der vorherigen Builds durch, das ist normalerweise nicht zwingend notwendig, aber es ist eine gute Praxis (siehe auch die Build-Profile weiter unten); dies entfernt zuvor erstellte Bibliotheken und Objektdateien im Verzeichnis build/. Wenn das Projekt neu konfiguriert ist und das Build-System die verschiedenen Abhängigkeiten überprüft, sollten Sie eine Ausgabe sehen, die etwa wie folgt aussieht:

Top gesetzt auf      : /home/ns3user/workspace/bake/source/ns-3-dev
Ziel gesetzt auf      : /home/ns3user/workspace/bake/source/ns-3-dev/build
Überprüfe 'gcc' (C-Compiler)        : /usr/bin/gcc 
Überprüfe cc Version                : 7.3.0 
Überprüfe 'g++' (C++-Compiler)      : /usr/bin/g++ 
Überprüfe Kompilierungsflag -march=native Unterstützung : ok 
Überprüfe Kompilierungsflag -Wl,--soname=foo Unterstützung : ok 
Überprüfe Kompilierungsflag -std=c++11 Unterstützung       : ok 
Überprüfe Boost-Includes   : Header nicht gefunden, bitte eine --boost-includes Argument angeben (siehe Hilfe) 
Überprüfe Boost-Includes   : Header nicht gefunden, bitte eine --boost-includes Argument angeben (siehe Hilfe) 
Überprüfe Programm 'python'            : /usr/bin/python 
Überprüfe Python-Version >= 2.3       : 2.7.15 python-config                                                                     : /usr/bin/python-config
Frage python-config nach pyembed '--cflags --libs --ldflags' Flags : ja
Teste pyembed Konfiguration                                      : ja
Frage python-config nach pyext '--cflags --libs --ldflags' Flags   : ja
Teste pyext Konfiguration                                        : ja

Überprüfe Kompilierungsflag -fvisibility=hidden Unterstützung          : ok 
Überprüfe Kompilierungsflag -Wno-array-bounds Unterstützung            : ok 
Überprüfe pybindgen Standort          : ../pybindgen ,!(geschätzt) 
Überprüfe Python-Modul 'pybindgen'   : 0.19.0. ,!post4+g823d8b2 
Überprüfe pybindgen Version           : 0.19.0. ,!post4+g823d8b2 
Überprüfe Code-Schnipsel                : ja 
Überprüfe Typen uint64_t und unsigned long Äquivalenz : nein 
Überprüfe Code-Schnipsel                                 : nein 
Überprüfe Typen uint64_t und unsigned long long Äquivalenz     : ja 
Überprüfe die apidefs, die für Python-Bindungen verwendet werden können                       : gcc-LP64 
Überprüfe internes GCC cxxabi         : vollständig 
Überprüfe Python-Modul 'pygccxml'    : nicht gefunden 
Überprüfe Klickstandort              : nicht gefunden 
Überprüfe Programm 'pkg-config'        : /usr/bin/pkg-config 
Überprüfe 'gtk+-3.0'                  : nicht gefunden 
Überprüfe 'libxml-2.0'                : ja 
Überprüfe uint128_t                   : nicht gefunden 
Überprüfe __uint128_t                 : ja 
Überprüfe Hochpräzision-Implementierung   : 128-Bit Ganzzahl ,!(Standard) 
Überprüfe Header stdint.h             : ja 
Überprüfe Header inttypes.h           : ja 
Überprüfe Header sys/inttypes.h       : nicht gefunden 
Überprüfe Header sys/types.h          : ja 
Überprüfe Header sys/stat.h           : ja 
Überprüfe Header dirent.h             : ja 
Überprüfe Header stdlib.h             : ja 
Überprüfe Header signal.h             : ja 
Überprüfe Header pthread.h            : ja 
Überprüfe Header stdint.h             : ja 
Überprüfe Header inttypes.h           : ja 
Überprüfe Header sys/inttypes.h       : nicht gefunden
Überprüfe Bibliothek rt                  : ja 
Überprüfe Header sys/ioctl.h          : ja 
Überprüfe Header net/if.h             : ja 
Überprüfe Header net/ethernet.h       : ja 
Überprüfe Header linux/if_tun.h       : ja 
Überprüfe Header netpacket/packet.h   : ja 
Überprüfe NSC Standort                : nicht gefunden 
Überprüfe 'sqlite3'                   : nicht gefunden 
Überprüfe Header linux/if_tun.h       : ja 
Überprüfe Python-Modul 'gi'          : 3.26.1 
Überprüfe Python-Modul 'gi.repository.GObject'      : ok 
Überprüfe Python-Modul 'cairo'                      : ok 
Überprüfe Python-Modul 'pygraphviz'                 : 1.4rc1 
Überprüfe Python-Modul 'gi.repository.Gtk'          : ok 
Überprüfe Python-Modul 'gi.repository.Gdk'          : ok 
Überprüfe Python-Modul 'gi.repository.Pango'        : ok 
Überprüfe Python-Modul 'gi.repository.GooCanvas'    : ok 
Überprüfe Programm 'sudo'                             : /usr/bin/sudo 
Überprüfe Programm 'valgrind'                         : nicht gefunden 
Überprüfe 'gsl' : nicht gefunden python-config            : nicht gefunden 
Überprüfe Kompilierungsflag -fstrict-aliasing Unterstützung : ok 
Überprüfe Kompilierungsflag -fstrict-aliasing Unterstützung : ok 
Überprüfe Kompilierungsflag -Wstrict-aliasing Unterstützung : ok 
Überprüfe Kompilierungsflag -Wstrict-aliasing Unterstützung : ok 
Überprüfe Programm 'doxygen'                          : /usr/bin/doxygen
---- Zusammenfassung der optionalen ns-3 Funktionen:
Build-Profil : optimiert
Build-Verzeichnis : 
BRITE-Integration : nicht aktiviert (BRITE nicht aktiviert (siehe Option --with-brite)) 
DES-Metriken-Ereignissammlung : nicht aktiviert (Standard ist deaktiviert) 
Emulation FdNetDevice        : aktiviert 
Beispiele                     : aktiviert 
Dateideskriptor NetDevice    : aktiviert 
GNU-Wissenschaftsbibliothek (GSL) : nicht aktiviert (GSL nicht gefunden) 
Gcrypt-Bibliothek               : nicht aktiviert
(libgcrypt nicht gefunden: Sie können ,!libgcrypt-config verwenden, um den Speicherort zu finden.) GtkConfigStore               : nicht aktiviert (Bibliothek 'gtk+-3.0 >= 3.0' nicht gefunden)
MPI-Unterstützung                  : nicht aktiviert (Option --enable-mpi nicht ausgewählt)
ns-3 Click-Integration       : nicht aktiviert (nsclick nicht aktiviert (siehe Option --with-nsclick))
ns-3 OpenFlow-Integration   : nicht aktiviert (Erforderliche Boost-Bibliotheken nicht gefunden) 
Netzwerksimulation wie Wiege    : nicht aktiviert (NSC nicht gefunden (siehe Option --with-nsc))
PlanetLab FdNetDevice         : nicht aktiviert (PlanetLab-Betriebssystem nicht erkannt ,!(siehe Option --force-planetlab)) PyViz-Visualizer : aktiviert 
Python API-Scanning-Unterstützung   : nicht aktiviert (Fehlendes 'pygccxml' Python-Modul)
Python-Bindungen : aktiviert 
Echtzeitsimulator           : aktiviert 
SQlite-Statistiken-Ausgabe      : nicht aktiviert (Bibliothek 'sqlite3' nicht gefunden)
Tap-Brücke                    : aktiviert 
Tap FdNetDevice               : aktiviert
Tests                         : aktiviert 
Threading-Primitiven          : aktiviert 
Verwenden Sie sudo, um das suid-Bit festzulegen   : nicht aktiviert (Option --enable-sudo nicht ausgewählt)
XmlIo                         : aktiviert
'configure' erfolgreich abgeschlossen (6.387s)

Beachten Sie den letzten Teil des oben angegebenen Listings. Einige ns-3 Optionen sind standardmäßig nicht aktiviert oder benötigen Unterstützung vonseiten des Systems für ein korrektes Funktionieren. Um zum Beispiel XmlTo zu aktivieren, muss die Bibliothek libxml-2.0im System vorhanden sein. Wenn diese Bibliothek nicht gefunden wurde und die entsprechende ns-3-Funktion nicht aktiviert wurde, wird eine Meldung angezeigt. Außerdem sollten Sie beachten, dass es möglich ist, den Befehl sudo zu verwenden, um das SUID-Bit „Setuid-Gruppen-ID zur Laufzeit“ für bestimmte Programme zu setzen. Dies ist standardmäßig nicht aktiviert, wodurch diese Funktion als „nicht aktiviert“ angezeigt wird. Schließlich können Sie eine Liste der aktivierten Optionen mit Waf und dem Parameter --check-config.

anzeigen. Kommen wir nun zurück und wechseln zurück zur Debug-Build, die Beispiele und Tests enthält.

$ ./waf clean 
$ ./waf configure --build-profile=debug --enable-examples --enable-tests

Das Build-System ist nun konfiguriert, und Sie können Debug-Versionen der ns-3-Programme einfach erstellen, indem Sie eintippen:

$ ./waf

Die oben beschriebenen Schritte haben Sie möglicherweise dazu gebracht, einen Teil des ns-3 Systems zweimal zu erstellen, aber jetzt wissen Sie, wie Sie die Konfiguration ändern und optimierten Code erstellen können.

Um zu überprüfen, welches Profil für diese Projektkonfiguration aktiv ist, gibt es den Befehl:

$ ./waf --check-profile 
Waf: Betritt das Verzeichnis `/path/to/ns-3-allinone/ns-3.29/build` 
Build-Profil: debug

Das oben betrachtete Szenario build.py unterstützt auch die Argumente --enable-examples und --enable-tests, aber andere Optionen Waf unterstützt es nicht direkt. Zum Beispiel wird dies nicht funktionieren:

$ ./build.py --disable-python

die Ausgabe wird sein:

build.py: error: no such option: --disable-python

Dennoch kann der spezielle Operator -- verwendet werden, um zusätzliche Parameter über wafzu übermitteln. Daher würde anstelle des oben genannten der folgende Befehl funktionieren:

$ ./build.py -- --disable-python

da er den Hauptbefehl generiert ./waf configure —disable-python. Hier sind noch einige einführende Tipps zur Waf.

Fehlerbehandlung beim Build

Die Releases von ns-3 wurden auf den neuesten C++-Compilern getestet, die zum Zeitpunkt der Veröffentlichung in gängigen Linux- und MacOS-Distributionen verfügbar sind. Im Laufe der Zeit werden jedoch neue Distributionen mit neuen Compilern veröffentlicht, und diese neueren Compiler sind in der Regel strenger bezüglich Warnungen. ns-3 konfiguriert seinen Build so, dass alle Warnungen als Fehler behandelt werden, daher kann es manchmal vorkommen, dass eine Warnung des Compilers den Build stoppt, wenn Sie eine ältere Version in einem neueren System verwenden.

Zum Beispiel gab es früher das Release ns-3.28 für Fedora 28, das eine neue Hauptversion beinhaltete. gcc (gcc-8). Der Build des Releases ns-3.28 oder früherer Versionen unter Fedora 28 mit installiertem Gtk2+ führt zu folgendem Fehler:

/usr/include/gtk-2.0/gtk/gtkfilechooserbutton.h:59:8: error: unnecessary parentheses ,!in declaration of ‘__gtk_reserved1’ [-Werror=parentheses] void (*__gtk_reserved1);

In den Releases ab ns-3.28.1 ist Waf eine Option verfügbar, um diese Probleme zu beheben. Sie deaktiviert das Setzen des Flags „-Werror“ in g++ und clang++. Diese Option heißt „—disable-werror“ und sollte während der Konfiguration angewendet werden:

$ ./waf configure --disable-werror --enable-examples --enable-tests

Konfigurieren oder Bauen

Einige Befehle Waf sind nur in der Konfigurationsphase sinnvoll, während andere nur in der Build-Phase wirken. Beispielsweise, wenn Sie die Emulationsfunktionen von ns-3 verwenden möchten, können Sie das Bit suid verwendend, sudowie oben beschrieben. Dies wird die Befehle der Konfigurationsphase außer Kraft setzen, und somit können Sie die Konfiguration mit folgendem Befehl ändern, der ebenfalls Beispiele und Tests einbezieht.

$ ./waf configure --enable-sudo --enable-examples --enable-tests

Wenn Sie dies tun, Waf wird sudo, um die Emulationscode-Sockets für den Betrieb mit Rechten zu ändern. root. In Waf Es gibt viele weitere Optionen für die Konfigurations- und Build-Phasen. Um die Möglichkeiten zu erkunden, geben Sie ein:

$ ./waf --help

Im nächsten Abschnitt werden wir einige testbezogene Optionen verwenden.

Build-Profile

Wir haben bereits gesehen, wie man Waf für Builds debug und optimiert:

$ ./waf --build-profile=debug

Es gibt auch ein intermischliches Build-Profil, release. Die Option -d ist ein Synonym für --build-profile. Das Build-Profil steuert die Verwendung von Protokollierung, Assertions und Compiler-Optimierungsschlüsseln:

Lehrbuch zum Netzwerk-Simulator ns-3. Kapitel 3

Wie Sie sehen können, sind Logging und Assertions nur in Debug-Builds verfügbar. Die empfohlene Vorgehensweise besteht darin, Ihr Skript im Debug-Modus zu entwickeln und dann wiederholte Durchläufe (für Statistiken oder zur Ändern von Parametern) im optimierten Build-Profil auszuführen.

Wenn Sie Code haben, der nur in bestimmten Build-Profilen ausgeführt werden soll, verwenden Sie das Code Wrapper Macro:

NS_BUILD_DEBUG (std::cout << "Teil einer Ausgabzeile..." << std::flush; timer.Start ,!()); DoLongInvolvedComputation ();
NS_BUILD_DEBUG (timer.Stop (); std::cout << "Fertig: " << timer << std::endl;)

Standardmäßig Waf legt die Build-Artefakte im Build-Verzeichnis ab. Sie können ein anderes Ausgabeverzeichnis mit der Option - -out, zum Beispiel:

$ .\/waf configure --out=my-build-dir

Indem Sie dies mit Build-Profilen kombinieren, können Sie leicht zwischen verschiedenen Kompilierungsoptionen wechseln:

$ .\/waf configure --build-profile=debug --out=build\/debug
$ .\/waf build
... 
$ .\/waf configure --build-profile=optimized --out=build\/optimized 
$ .\/waf build
...

Was Ihnen ermöglicht, mit mehreren Builds zu arbeiten, ohne jedes Mal den letzten Build neu zu schreiben. Wenn Sie auf ein anderes Profil umschalten, Waf wird nur dieses kompiliert, ohne eine vollständige Rekompilierung von allem.

Wenn Sie auf diese Weise zwischen Build-Profilen wechseln, müssen Sie darauf achten, jedem Mal dieselben Konfigurationsparameter zu geben. Dabei kann Ihnen die Definition mehrerer Umgebungsvariablen helfen:

$ export NS3CONFIG="--enable-examples --enable-tests" 
$ export NS3DEBUG="--build-profile=debug --out=build\/debug"
$ export NS3OPT=="--build-profile=optimized --out=build\/optimized" 

$ .\/waf configure $NS3CONFIG $NS3DEBUG
$ .\/waf build 
... 
$ .\/waf configure $NS3CONFIG $NS3OPT
$ .\/waf build

Compiler und Flags

In den obigen Beispielen Waf verwendet ns‑3 den C++ Compiler aus GCC ( g++). Es ist jedoch möglich, den verwendeten Waf C++ Compiler zu ändern, indem Sie die Umgebungsvariable CXX definieren. Zum Beispiel, um den C++ Compiler Clang, clang++, zu verwenden,

$ CXX="clang++" .\/waf configure 
$ .\/waf build 

Ähnlich können Sie Waf so konfigurieren, dass die verteilte Kompilierung mit distcc:

$ CXX="distcc g++" .\/waf configure 
$ .\/waf build

Weitere Informationen zu distcc und verteilter Kompilierung finden Sie auf der Projektseite im Abschnitt „Dokumentation“. Um beim Konfigurieren von ns‑3 Compiler-Flags hinzuzufügen, verwenden Sie die Umgebungsvariable CXXFLAGS_EXTRA.

Installation

Waf kann verwendet werden, um Bibliotheken an verschiedenen Stellen im System zu installieren. Standardmäßig befinden sich die gesammelten Bibliotheken und ausführbaren Dateien im Verzeichnis build, und da Waf den Speicherort dieser Bibliotheken und ausführbaren Dateien kennt, ist es nicht notwendig, die Bibliotheken irgendwo anders zu installieren.

Wenn die Benutzer eine Installation außerhalb des Build-Verzeichnisses bevorzugen, können sie den Befehl ./waf installausführen. Standardmäßig ist das Präfix für die Installation - /usr/local, daher ./waf install werden Programme in /usr/local/bin, Bibliotheken in /usr/local/lib und Header-Dateien in /usr/local/includeinstalliert. Superuser-Rechte sind normalerweise erforderlich, um mit dem Standardpräfix zu installieren, daher lautet ein typischer Befehl sudo ./waf install. Beim Ausführen wird Waf zunächst die gemeinsamen Bibliotheken im Build-Verzeichnis bevorzugen, dann wird er die Bibliotheken gemäß dem Bibliothekspfad suchen, der in der lokalen Umgebung konfiguriert ist. Daher ist es eine gute Praxis, sicherzustellen, dass die richtigen Bibliotheken verwendet werden, wenn Bibliotheken im System installiert werden. Benutzer können eine Installation mit einem anderen Präfix wählen, indem sie während der Konfiguration die Option --prefix, zum Beispiel:

./waf configure --prefix=/opt/local

übergeben. Wenn der Benutzer später, nach dem Build, den Installationsbefehl eingibt ./waf, wird das Präfix verwendet /opt/local.

Team ./waf clean sollte vor einer Neukonfiguration des Projekts verwendet werden, wenn zur Installation Waf ein anderes Präfix verwendet wird.

Daher ist es nicht notwendig, ns‑3 zu starten. ./waf installDie meisten Benutzer benötigen diesen Befehl nicht, da Waf die aktuellen Bibliotheken aus dem Build-Verzeichnis übernehmen wird, einige Benutzer könnten es jedoch als nützlich empfinden, wenn ihre Tätigkeit das Arbeiten mit Programmen außerhalb des ns‑3-Verzeichnisses umfasst.

Waf ist einheitlich

Auf der obersten Ebene des ns‑3-Quellbaum gibt es nur ein Waf-Skript. Wenn Sie anfangen, werden Sie viel Zeit im Verzeichnis scratch/ oder tiefer insrc/... verbringen , und dabei müssen Sie möglicherweise Wafstarten. Sie können sich einfach merken, wo Sie sind, und Waf folgendermaßen ausführen:

$ ../../../../waf ...

aber das wird mühsam und fehleranfällig, deshalb gibt es bessere Lösungen. Eine gängige Methode ist die Verwendung eines Texteditors, wie Eclipse oder emacs, in dem zwei Terminal-Sitzungen geöffnet werden, eine für das Bauen von ns‑3 und die andere zum Bearbeiten des Quellcodes. Wenn Sie nur tarball, kann eine Umgebungsvariable helfen:

$ export NS3DIR="$PWD" 
$ function waff { cd $NS3DIR && .\/waf $* ; } 

$ cd scratch 
$ waff build

Im Verzeichnis des Moduls könnte es verlockend erscheinen, ein triviales Waf-Skript nach dem Muster hinzuzufügen exec ..\/..\/waf. Bitte tun Sie das nicht. Es verwirrt Anfänger und kann bei fehlerhafter Ausführung zu schwer auffindbaren Build-Fehlern führen. Die oben gezeigten Lösungen sind der Weg, der eingeschlagen werden sollte.

3.5 ns-3 testen

Sie können die Modul-Tests der ns-3-Distribution ausführen, indem Sie das Skript .\/test.py:

$ .\/test.py

Diese Tests werden parallel zu Wafdurchgeführt. Am Ende sollten Sie eine Meldung sehen, dass

92 von 92 Tests bestanden (92 bestanden, 0 fehlgeschlagen, 0 abgestürzt, 0 Valgrind-Fehler)

Diese Meldung ist wichtig, um Abstürze, Fehler oder Valgrind-Fehler zu identifizieren und weist auf Probleme im Code oder auf Inkompatibilität zwischen den Tools und dem Code hin.

Sie werden auch die Zusammenfassungsausgabe von Waf und dem Tester sehen, der jeden Test ausführt, die ungefähr so aussieht:

Waf: Verzeichnis betreten `\/path\/to\/workspace\/ns-3-allinone\/ns-3-dev\/build' 
Waf: Verzeichnis verlassen `\/path\/to\/workspace\/ns-3-allinone\/ns-3-dev\/build' 
'build' wurde erfolgreich abgeschlossen (1.799s) 

Gebautes Modul:
aodv           Anwendungen          Brücke
click          config-store          Kern
csma           csma-layout           dsdv
emu            Energie               Flussüberwachung
Internet       lte                   Mesh
Mobilität      mpi                   netanim
Netzwerk       nix-vector-routing    ns3tcp
ns3wifi        olsr                  openflow
punkt-zu-punkt punkt-zu-punkt-layout Ausbreitung
spektrum       Statistiken           tap-bridge
vorlage       Test                  Werkzeuge
topologie-lesen  uan                   virtuelle-netzwerkgerät
Visualizer     wifi                  wimax

PASS: TestSuite ns3-wifi-interference
PASS: TestSuite histogram 

...

PASS: TestSuite object
PASS: TestSuite random-number-generators
92 von 92 Tests bestanden (92 bestanden, 0 fehlgeschlagen, 0 abgestürzt, 0 Valgrind-Fehler)

Dieses Kommando wird normalerweise von Nutzern ausgeführt, um schnell die Richtigkeit des Builds der ns-3-Distribution zu überprüfen. (Beachten Sie, dass die Reihenfolge der Zeilen „PASS: ...“ variieren kann, das ist normal. Wichtig ist, dass in der letzten Zeile am Ende des Berichts alle Tests bestanden wurden; kein Test ist fehlgeschlagen oder abgestürzt.) Und Waf, und test.py werden die Arbeiten unter den verfügbaren Kernen der Maschine parallelisiert.

3.6 Skript ausführen

Normalerweise führen wir Skripte unter Kontrolle von Waf. Das ermöglicht dem Build-System sicherzustellen, dass die Pfade zur gemeinsamen Bibliothek korrekt gesetzt sind und dass die Bibliotheken während der Ausführung verfügbar sind. Um das Programm zu starten, verwenden Sie einfach Waf und dem Parameter - -run. Lassen Sie uns für ns-3 das Äquivalent des allgegenwärtigen Programms hello world, indem Sie Folgendes eingeben:

$ .\/waf --run hello-simulator

Waf wird zunächst überprüfen, ob das Programm richtig kompiliert wurde, und bei Bedarf die Kompilierung durchführen. Dann Waf wird es das Programm ausführen, das die folgende Ausgabe erzeugt.

Hello Simulator

Herzlichen Glückwunsch! Sie sind jetzt ein Benutzer von ns-3!

Was soll ich tun, wenn ich das Ergebnis nicht sehe?

Wenn Sie Nachrichten sehen, Waf, die darauf hinweisen, dass die Kompilierung erfolgreich abgeschlossen wurde, aber keine Ausgabe sehen „Hello Simulator“, besteht die Möglichkeit, dass Sie im Abschnitt [Kompilierung-mit-Waf] Ihren Kompilierungsmodus auf optimiert, aber das Zurückschalten in den Modus debugvergessen haben. Alle Konsolenausgaben, die in diesem Handbuch verwendet werden, nutzen eine spezielle Komponente von ns-3, die die Protokollierung durchführt, und werden verwendet, um benutzerdefinierte Nachrichten in die Konsole zu drucken. Die Ausgabe dieser Komponente ist automatisch deaktiviert, wenn optimierter Code kompiliert wird – er ist „optimiert“. Wenn Sie die Ausgabe „Hello Simulator“ nicht sehen, geben Sie Folgendes ein:

$ ./waf configure --build-profile=debug --enable-examples --enable-tests

um Waf die Kompilierung von Debug-Versionen der ns-3-Programme, die Beispiele und Tests enthalten, einzustellen. Dann müssen Sie die aktuelle Debug-Version des Codes erneut kompilieren, indem Sie

$ ./waf

Jetzt, wenn Sie das Programm hello-simulator, ausführen, sollten Sie das erwartete Ergebnis sehen.

3.6.1 Befehlszeilenargumente

Um Befehlszeilenargumente an das ns-3-Programm zu übergeben, verwenden Sie dieses Muster:

$ ./waf --run  --command-template="%s "

Ersetzen Sie durch den Namen Ihres Programms und durch die Argumente. Das Argument - command-template für Waf ist im Wesentlichen ein Rezept zur Erstellung der tatsächlichen Befehlszeile Waf die zur Ausführung des Programms verwendet wird. Waf überprüft, ob die Kompilierung abgeschlossen ist, stellt die Pfade zur gemeinsamen Bibliothek ein und ruft dann die ausführbare Datei auf, indem es das bereitgestellte Befehlszeilenmuster verwendet und den Programmnamen anstelle des Platzhalters %s einfügt. Wenn Ihnen diese Syntax kompliziert erscheint, gibt es eine einfachere Variante, die das ns-3-Programm und seine Argumente in einfache Anführungszeichen einschließt:

$ ./waf --run ' --arg1=value1 --arg2=value2 ...'

Ein weiteres, besonders nützliches Beispiel ist die selektive Ausführung von Test-Suites. Angenommen, es gibt eine Testsuite (suite) mytest (die es tatsächlich nicht gibt). Zuvor haben wir das Skript ./test.py verwendet, um eine Reihe von Tests parallel auszuführen, das mehrfach die Testprogramm test-runneraufruft. test-runner direkt zur Ausführung eines Tests:

$ ./waf --run test-runner --command-template="%s --suite=mytest --verbose"

Die Argumente werden an das Programm übergeben test-runner. Da mytest nicht existiert, wird eine Fehlermeldung generiert. Um die verfügbaren Parameter von test-runner anzuzeigen, geben Sie ein:

$ ./waf --run test-runner --command-template="%s --help"

3.6.2 Debugging

Um ns-3-Programme unter einer anderen Utility wie einem Debugger (z. B. gdb) oder einem Speicherüberprüfungstool (z. B. valgrind), verwenden Sie eine ähnliche Form - -command-template = "…". Zum Beispiel, um den Debugger zu starten gdb Ihr Programm hello-simulator ns-3 mit den Argumenten:

$ ./waf --run=hello-simulator --command-template="gdb %s --args "

Beachten Sie, dass der Name des ns-3-Programms mit dem Argument kommt - -run, und die Kontroll-Utility (hier gdb) ist das erste Token im Argument - command-template. Die Option - -args berichtet gdb, wobei der Rest der Befehlszeile zur „niedrigeren“ Anwendung gehört. (Einige Versionen gdb verstehen die Option nicht, - -args. In diesem Fall entfernen Sie die Programmargumente von - command-template und verwenden Sie den Befehlssatz gdb args.) Wir können dieses Rezept mit dem vorherigen kombinieren, um einen Test im Debugger zu starten:

$ ./waf --run test-runner --command-template="gdb %s --args --suite=mytest --verbose"

3.6.3 Arbeitsverzeichnis

Waf sollte aus seinem Standort im Wurzelverzeichnis des ns-3-Baums gestartet werden. Dieser Ordner wird zum Arbeitsverzeichnis, in dem die Ausgabedateien geschrieben werden. Aber was ist, wenn Sie diese Dateien außerhalb des ns-3-Quellbaums speichern möchten? Verwenden Sie das Argument - -cwd:

$ ./waf --cwd=...

Es könnte für Sie bequemer sein, die Ausgabedateien in Ihrem Arbeitsverzeichnis zu erhalten. In diesem Fall könnte eine solche indirekte Handlung hilfreich sein:

$ function waff {
CWD="$PWD" 
cd $NS3DIR >/dev/null 
./waf --cwd="$CWD" $*
cd - >/dev/null 
}

Diese Dekorierung der vorherigen Befehlszeile speichert das aktuelle Arbeitsverzeichnis, wechselt in das Verzeichnis Waf, und weist dann Waf an, das Arbeitsverzeichnis vor dem Start des aktuellen Programms wieder auf das gespeicherte zu ändern. Wir erwähnen den Befehl - -cwd , um der Vollständigkeit willen, die meisten Benutzer starten Waf einfach aus dem obersten Verzeichnis und generieren dort die Ausgabedateien.

Fortsetzung: Kapitel 4

Quelle: habr.com

60GB SSD 8Gb DDR4