2017-08-25 3 views
0

Ich möchte wissen, ob es eine Möglichkeit gibt, dynamisch mit einem Makefile zu kompilieren. Angenommen, ich habe a.cpp, b.cpp und c.cpp Dateien. Dies sind einige Algorithmen, die ich ihre Laufzeit vergleichen möchte. Zuerst möchte ich nur eine und b-Datei kompilieren und dann ausführen, um das Ergebnis zu sehen. Als nächstes möchte ich b und c kompilieren und ausführen.kompilieren nur ausgewählte Dateien dynamisch mit Makefile

Es ist nicht nur eine Reihenfolge, a und b können kompiliert werden oder b und c oder a und c oder (a, b und c) insgesamt.

Kann ich dies mit der makefile tun?

+1

Ja, Sie können alles tun, ein Makefile verwenden. Probiere es einfach. –

+0

Ich würde gerne ein Plädoyer einreichen, dass du _don't_ :) es ist perfekt machbar, aber es macht das Leben ein Elend für Betreuer, es sei denn, es wird sehr sorgfältig behandelt. Es ist alles sehr gut, wenn Sie etwas kompilieren, das nur auf der gleichen Plattform ausgeführt wird. Aber wenn Sie jemals Cross-Compilieren müssen, versuchen Sie schließlich, etwas auszuführen, das für eine andere Plattform gebaut wurde. Einfach schrecklich. Aber wenn Sie es wirklich tun müssen, geben Sie bitte mehr Informationen darüber, was Sie genau erreichen wollen. –

+0

@KevinBoone Ich möchte die Rechenzeit der Algorithmen vergleichen. Im Moment habe ich ein sehr einfaches Makefile, das alle cpp-Dateien kompiliert (Algorithmen-Code). Aber ich erwäge, eine Textdatei als eine Konfigurationsdatei zu erstellen, um den Namen von Algorithmen anzugeben, die Benutzer durch Kommentare ein- und ausführen möchten. – Q123

Antwort

1

Nicht sicher, wie Sie Laufzeiten "vergleichen" wollen, so druckt dieses Beispiel sie nur über den Befehl time, aber Sie können awk und gnuplot verwenden, um Plots zu generieren, wenn Sie möchten. Jedes Ziel gibt einfach einen Shellbefehl an, der ausgeführt werden soll. Die % wird verwendet, um ein Ziel basierend auf Mustern zu definieren.

all: ab bc 

%.out: %.cpp 
    gcc $< -o [email protected] 

ab: a.out b.out 
    time ./a.out && time ./b.out 

bc: b.out c.out 
    time ./b.out && time ./c.out 

(stellen Sie sicher, Einbuchtung Tabs ist)

+0

Die Art, wie ich die Algorithmen vergleichen möchte, ist wie zum Beispiel, ich habe eine Trajektoriedaten und ich möchte, dass die Algorithmen die Daten komprimieren und die Zeit sehen, die jeder Algorithmus braucht. Zuerst möchte ich die a und b Algorithmen dann als nächstes b und c vergleichen. – Q123

0

Während ein Compiler und Make-Datei möglicherweise daran gearbeitet werden könnte, um zu tun, Id schlage vor, Sie tun dies nicht tun. Strukturieren Sie Ihr Programm neu.

z.B. Ich nehme an, Sie haben wie test_runner.cpp, algorithm_a.cpp und algorithm_b.cpp?

z.B. Machen Sie eine Template-Funktion, indem Sie das Algorthim zum Testen verwenden. Verwenden Sie es dann für jede Implementierung.

template<class T> void test_implementation() { ... do stuff with T to test it ... } 

void main() 
{ 
    test_implementation<A>(); 
    test_implementation<A>(); 
} 

Also erstens, was ist so schlecht daran, sie zu einem Programm für Ihren Test zu machen? Dann können Sie die beiden Algorithmen nacheinander ausführen und zeitlich ablaufen lassen, oder Sie könnten einen Befehlszeilenparameter verwenden?

Altertively, wenn Sie test_runner.cpp als eine Bibliothek betrachten, dann sind Ihre zwei Algorthimns zum Testen separate Programme, nur mit dieser Bibliothek.

Nehmen Sie sich auch etwas Zeit, um die Makefile-Syntax zu erlernen. Sobald Sie die Syntax-Lösungen verstehen, sollte offensichtlich sein, aber immer noch nicht bedeutet, etwas, was Sie auf diese Situation anwenden sollten.

1

Ja, das ist nur eine Frage der Abhängigkeit Ordnung: es etwas aussehen würde:

all: results_ab results_bc 
    #compare results... 

results_ab: a.o b.o 
    # link, and run, and store results 

results_bc: results_ab b.o c.o 
    # link, run and store results. 
+0

Aber wenn ich jede Datei (a, b und c) kompilieren möchte? Es handelt sich nicht um eine Bestellung. Ein Benutzer bestimmt, welche Datei kompiliert wird. – Q123

Verwandte Themen