Makefile (für das Interview erforderlich)

1.M Makefile Grundeinführung

1 .1 Makefile Einführung

make ist ein Projektmanager, der aktualisierte Dateien entsprechend der Dateizeit spontan erkennt, um den Kompilierungsaufwand zu verringern. Makefile-Dateien und make-Tools werden zusammen verwendet, um das Kompilieren und Verknüpfen von Engineering-Projekten zu steuern. Es kann auch zum Schreiben von Handbuchseiten verwendet werden und Programme. Installation. Das make-Tool wird verwendet, um den Inhalt des Makefiles zu interpretieren und auszuführen. Die Makefile-Datei enthält normalerweise die Abhängigkeitsbeziehung zwischen der Quelldatei und der Zieldatei sowie die Regeln zum Generieren der Zieldatei aus der Quelldatei. Das Make-Tool kann bestimmen, welche Dateien gemäß dem Makefile, der Erstellungsreihenfolge der Zieldateien usw. neu kompiliert werden müssen.
 

1,2 m akefile Dateiname

Make erkennt automatisch GUNmakefile, makefile und Makefile. Es ist am besten, Makefile zu verwenden. Einige Systeme erkennen keine anderen Dateinamen.

Natürlich können Sie make -f xxx verwenden, um die Datei anzugeben. Versuchen Sie beim Erstellen, makefilexxx zu verwenden

1 .3 Makefile-Regeln

Ziel: abhängig

           Befehl

Ziel: Es kann ein Dateiname oder eine Bezeichnung sein, aber es muss vorhanden sein. Wenn das Tag das erste ist, wird es immer ausgeführt.

Abhängigkeit: Sie können Dateinamen, Zeichen usw. verwenden. Nicht haben können

Befehl: Fügen Sie die Tabulatortaste am Zeilenanfang hinzu, es gibt keine

test.o:test.s
	gcc -c test.s -o test.o

Hinweis: Es gibt keine unvermeidliche Sequenzbeziehung zwischen Regeln und Regeln

           Das erste Ziel wird das ultimative Ziel

           Bevor Sie make verwenden, müssen Sie die Systemzeit genau korrigieren, da das Makefile nach Zeit kompiliert wird

Annahme : Ändern Sie zuerst fun1.c, löschen Sie dann das Original fun1.c und fun1.out und kopieren Sie es erneut, obwohl es sich derzeit um die Originaldatei handelt.

          Die Zeit von fun1.o und App hat sich jedoch geändert, und das System erkennt, dass sich die Zeit seit dem letzten Mal geändert hat, sodass sie nicht ausgeführt wird.

2. Makefile-Strukturzusammensetzung und Ausführungsschritte

2.1 Explizite Regeln

       Explizite Regeln erläutern, wie eine oder mehrere Objektdateien generiert werden. Dies wird vom Verfasser von Makefile, den zu generierenden Dateien, den abhängigen Dateien der Dateien und den zu generierenden Befehlen deutlich hervorgehoben.

sr1=test.c
G=gcc
#include tes.mk
#AAA=$(patsubst *.c,*.o $(notdir $(wildcard /root/test1/714/*.c)))
#	echo "$(AAA)"
test.out:test.o
	gcc test.o -o $@
test.o:test.s
	gcc -c test.s -o test.o
#	echo "$(test)"
%.s:%.i
	${G} -S $^ -o $@
test.i:${sr1}
	${G} -E $^ -o $@

2.2 Obskure Regeln

Zu beachten ist, dass die Erweiterung von "%" nach der Erweiterung von Variablen und Funktionen erfolgt, die Erweiterung von Variablen und Funktionen beim Laden des Makefiles durch make und das "%" in der Musterregel zur Laufzeit.

2.3 Variablendefinition

(1) Variablen müssen bei der Definition Anfangswerte erhalten. Wenn Sie Variablen verwenden, fügen Sie im Allgemeinen "$ (Variablenname)" oder "$ {Variablenname}" hinzu. () Wird empfohlen. Wenn eine Funktion vorhanden ist , eine farbige Erinnerung

SS=test.c
app:$(SS)
    gcc $(SS) -o app

(2) Betreiber:

=: Verzögerte Erweiterungszuweisung

A=$(B)
B=hello
    echo "$(A)"


结果:
echo "hello"
hello

: =: Sofort zuweisen

A:=$(B)
B=hello
    echo "$(A)"


结果:
echo ""
\r\n

+ =: Zuordnung anhängen

A=$(B)
B=HELLO
B+=1111
app:
	echo "$(A)"


结果:
echo "HELLO 1111"
HELLO 1111
  

? =: Beurteilen Sie, ob die Variable zugewiesen ist, wenn sie zuvor zugewiesen wurde, andernfalls keine Zuweisung

fliet=1
fliet?=2  //判断是否赋值过
A=$(fliet)
app:
    echo "$(A)"

结果:
echo "1"
1

屏蔽fliet=1
echo "2"
2

 

$$: $

$ ^:    alle Abhängigkeiten in der Regel

$ <: stellt den ersten abhängigen Namen in der Regel dar. Wenn es sich um eine kryptische Regel handelt, stellt es den ersten abhängigen Dateinamen dar, der von der kryptischen Regel hinzugefügt wird und in Verbindung mit Regeln wie% verwendet wird

$ @: Der Zielname der aktuellen Regel

@: Nicht auf Standardausgabe anzeigen /

2.4 Dateianweisungen

      Wenn der Befehl make gestartet wird, sucht er nach anderen Makefiles, auf die durch include hingewiesen wird, und platziert seinen Inhalt an der aktuellen Position. Genau wie die # include-Direktive von C / C ++.

      Wenn eine Datei nicht gefunden wird, generiert make eine Warnmeldung, es wird jedoch kein schwerwiegender Fehler sofort angezeigt. Es werden weiterhin andere Dateien geladen. Sobald das Lesen des Makefiles abgeschlossen ist, wiederholt make die Dateien, die nicht gefunden wurden oder nicht gelesen werden können. Wenn dies immer noch nicht funktioniert, zeigt make eine schwerwiegende Meldung an. Wenn Sie Dateien, die nicht gelesen werden können, ignorieren und die Ausführung fortsetzen möchten, können Sie vor dem Einschließen ein Minuszeichen "-" hinzufügen. Zum Beispiel: -include <Dateiname>

vim test.mk
写入A=HELLO

vim makefile

include test.mk
    echo "A"

结果:
HELLO

2.5 Falsche Ziele

Führen Sie mit dem angegebenen Label aus: (make -f xxfile clean)

clean:
	rm *.out test
.PHONY:clean

2.6 Ausführungsschritte

Laden Sie die Makefile-Datei -> erweitern Sie die Makefile-Datei unter inlcude -> Variableninitialisierung -> leiten Sie die obskuren Regeln ab, analysieren Sie alle Regeln

——> Erstellen Sie eine Abhängigkeitskette für die Zieldatei ——> Entscheiden Sie, welche gemäß den Abhängigkeiten generiert werden sollen ——> Ausführen

Wenn die Variable im Makefile verwendet wird, wird sie beim Erstellen der Abhängigkeitskette nicht sofort erweitert. Wenn die Abhängigkeit in der Variablen endgültig verwendet wird, wird sie wirklich erweitert

3. Makefile-Funktion

3.1 Ordnen Sie die Dateien im angegebenen Verzeichnis zu

3.2 Dateipfad entfernen

3.3 Musteraustauschfunktion

3.4 Anti-Filter-Funktion

2. Statische und dynamische Bibliotheken

(1) Statische Bibliothek:

Beim Kompilieren wird die gesamte Bibliothek in den Zielcode geladen.

Vorteile: Nach der Kompilierung ist keine Unterstützung für externe Funktionsbibliotheken erforderlich, schnelle Laufgeschwindigkeit

Nachteile: Wenn die statische Bibliothek geändert wird, muss der Code neu kompiliert werden, die kompilierte Datei ist größer als die dynamische Bibliothek

Schritt:

(2) Dynamische Bibliothek:

     Beim Kompilieren wird es nicht in den Zielcode geladen, aber die entsprechende Schnittstelle ist reserviert und wird nur geladen, wenn es während der Programmausführung verwendet wird.

     Vorteile: Der Kompilierungsaufwand ist relativ gering, die Bibliothek und der Code sind relativ unabhängig und das Bibliotheks-Upgrade hat keinen Einfluss auf die Verwendung des Programms

     Nachteile: langsame Ladegeschwindigkeit.

    Schritt:          

Die dynamische Bibliothek befindet sich im aktuellen Verzeichnis. Warum fordert das Betriebssystem auf, dass die Datei nicht gefunden werden kann?

Grund: Das Betriebssystem sucht standardmäßig an entsprechenden Speicherorten nach entsprechenden Bibliotheken: / lib, / usr / lib, usr / local / lib. Wenn die abhängige Bibliotheksdatei jedoch nicht gefunden wird, suchen Sie sie in der Umgebungsvariablen LD_LIBRARY_PATH.

Mit anderen Worten, die dynamische Bibliotheksdatei muss am Standardspeicherort oder an dem von LD_LIBRARY_PATH angegebenen Speicherort abgelegt werden, bevor sie vom Betriebssystem gefunden werden kann.

Lösung:

1) Exportieren Sie über Umgebungsvariablen LD_LIBRARY_PATH = dynamischer Bibliothekspfad

export LD_LIBRARY_PATH =. / lib Die vorübergehend wirksame Umgebungsvariable für den Neustart des Terminals ist ungültig. // Bestimmen Sie den Suchpfad der dynamischen Bibliothek.

2) Dauerhaft wirksam: "export LD_LIBRARY_PATH = dynamischer Bibliothekspfad" wird in die Terminalkonfigurationsdatei ~ / .bashrc geschrieben. Es wird empfohlen, einen absoluten Pfad zu verwenden.

3) Kopieren Sie die benutzerdefinierte dynamische Bibliothek an den Standardspeicherort

3. Makefile-Übungen

(1) Verwenden Sie makefile, um alle .c-Dateien im angegebenen Pfad zu kompilieren, um .o zu generieren und gleichzeitig ausführbare Dateien zu generieren

4. Makefile automatisch generieren

 

Die Kreise in der Abbildung zeigen Befehle an, Quadrate kennzeichnen Dateien und Kursivschrift kennzeichnet Dateien, die Sie selbst schreiben oder ändern müssen.

 

  1. Führen Sie den Befehl autoscan in dem Verzeichnis aus, in dem der Quellcode gespeichert ist, um die Datei configure.scan zu generieren.

  2. Benennen Sie die Datei configure.scan in configure.in oder configure.ac um (verwenden Sie in den frühen Tagen das Suffix .in) und ändern Sie die Standardkonfiguration.

  3. Führen Sie zwei Befehle, aclocal und autoconf zu erzeugen aclocal.m4 und configure Dateien sind;

  4. Führen Sie die autoheader Befehl, scannen die configure.ac Datei, und erzeugen die config.h.in Datei;

  5. Erstellen Sie eine Datei mit dem Namen Makefile.am und geben Sie den entsprechenden Inhalt ein.

  6. Führen Sie automake aus und generieren Sie Makefile.in gemäß der Datei Makefile.am.

  7. Führen Sie die configure Skriptdatei, die die endgültige Makefile - Datei entsprechend der Datei erzeugt Makefile.in

 

 

 

Ich denke du magst

Origin blog.csdn.net/qq_45604814/article/details/110495437
Empfohlen
Rangfolge