2016-07-08 15 views
6

Ich entwickle ein C++ - Projekt, das einem größeren Projekt beiliegt.Kompilieren Sie eine einzelne Datei unter CMake-Projekt?

Ich habe gesehen, dass auf dem größeren Projekt (ist eine Qt-Anwendung und es wird von qmake generiert) Ich bin in der Lage, eine einzelne Datei von der Linux-Befehlszeile zu kompilieren, nur den relativen Pfad zu der bestimmten Datei als ein Argument zu machen.

Auf der anderen Seite verwende ich CMake für mein eigenes Projekt. Wenn ich irgendeinen Code für eine Kompilierungseinheit modifiziere und ich seine Header-Datei modifizieren muss, muss ich lange warten, um seine Abhängigkeiten zu kompilieren und dann eine eigene Quelldatei. Aber es gibt Situationen, in denen ich lieber prüfen möchte, ob der Quellcode in der * .cc-Datei ohne Fehler kompilierbar ist.

Gibt es eine Möglichkeit, ein Makefile von CMake zu generieren, wie qmake dies tut? Wechseln zu qmake ist keine Option mehr.

+0

Versuchen 'help' auf Ihrem aktuellen CMake generierte machen Make-Datei. Ich bin mir ziemlich sicher, dass das auflisten wird, wie man nur eine einzige Objektdatei erstellt. – John

Antwort

3

Nein, CMake bietet keine integrierte Unterstützung zum Kompilieren einzelner Dateien.

Sie müssen ein Ziel für jede Objektdatei hinzufügen, möglicherweise durch eine Funktion, die über alle Dateien eines Verzeichnisses iteriert.

3

Nicht out-of-the-box. CMake stellt diese "internen" Makefile-Regeln im Hauptmakefile nicht zur Verfügung.

Sie können dies nur tun, wenn Sie überlegen, welche Art von Dateistruktur CMake intern verwendet. Sie können z.B. eine einzige .obj Dateien zum Kompilieren CMake mit generierten Makefiles

rufen
make -f CMakeFiles/myProg.dir/build.make CMakeFiles/myProg.dir/main.cc.obj 

, wenn Sie so etwas wie

cmake_minimum_required(VERSION 3.1) 

project(myProg CXX) 

file(WRITE "main.cc" "int main()\n{\nreturn 0;\n}") 
add_executable(myProg main.cc) 
6

Sie haben keine Skripte auf Ihre CMake zusätzliche benutzerdefinierte Ziele hinzufügen müssen, wie die Makefiles von CMake erzeugt enthalten bereits .o Ziele für jede .cc-Datei. Z.B. Wenn Sie eine Quelldatei namens mySourceFile.cc haben, wird ein Makefile in Ihrem Build-Verzeichnis vorhanden sein, das ein Ziel namens <Some Path>/mySourceFile.cc.o definiert. Wenn Sie cd in Ihr Build-Verzeichnis eingeben, können Sie grep oder ack-grep verwenden, um das Makefile zu finden, das dieses Ziel definiert, dann cd in das Verzeichnis dieses Makefiles und es zu erstellen.

z. nehme den Befehl ack-grep mySourceFile.cc.o druckt so etwas wie:

foo/bar/Makefile 
119:x/y/z/mySourceFile.o: x/y/z/mySourceFile.cc.o 
123:x/y/z/mySourceFile.cc.o: 
124: # recipe for building target 

Dann können Sie mySourceFile.cc.o bauen, indem Sie:

cd foo/bar && make x/y/z/mySourceFile.cc.o