Wir schreiben eine Bewerbung hauptsächlich in C
aber einige Untermodule sind hineingeschrieben C++
(unter Linux). Das Problem ist, wie man schreibt CMakeLists.txt
Dateien zu verwenden g++
für einige Unterverzeichnisse und gcc
für einander.
Mischen von C und C++ mit CMAKE
Cartesius00
Bort
Der Compiler und Linker wird normalerweise durch die Dateiendung bestimmt, wenn nicht anders festgelegt. Solange also die Dateiendungen in Ordnung sind, wird Ihr Code kompiliert und mit dem richtigen Compiler gelinkt.
Denken Sie nebenbei daran, die korrekten externen C-Deklarationen vorzunehmen, wenn Sie C und C++ mischen.
-
“wenn nicht anders eingestellt”, also ganz oben
CMakeLists.txt
verwendenproject(myproject)
statt zu sagenproject(myproject C)
.– Kongusbongus
15. März 2016 um 0:31 Uhr
-
Oder buchstabieren Sie es vollständig, indem Sie sagen
project(myproject LANGUAGES C CXX)
. Das Aktivieren von C und CXX ist das Standardverhalten von CMake, wenn Sie selbst keine Sprachen angeben. cmake.org/cmake/help/latest/command/project.html– Benutzer7610
18. Februar um 11:00 Uhr
CMake erledigt dies automatisch. Sie können beide Dateitypen in Ihrer CMakeLists.txt-Datei frei mischen:
. . .
add_executable(
my_program
code.cpp
more_code.c
)
Ich mache das die ganze Zeit und es funktioniert einfach.
-
Beachten Sie, dass Sie C-Header Guards benötigen. Also in code.cpp würden Sie sagen
extern "C" { #include "more_code.h" }
– Unapiedra
22. Mai 2014 um 11:21 Uhr
Sie können die LANGUAGE-Eigenschaft Ihrer Quelldateien auf „CXX“ setzen. Sehen Dokumentation.
CMake sollte den relevanten Compiler und Linker verwenden, der durch die Dateierweiterungen angegeben ist. In dem Fall, in dem Sie eine ausführbare Datei mit einer Kombination aus C und C++ kompilieren und verknüpfen, würden Sie sagen:
add_executable(MyEXE main.cpp myFile.c)
Ich möchte einen schmerzhaft trivialen Punkt hinzufügen.
In diesem Fall müssen Sie sicherstellen, dass Ihr Projekt die richtigen Sprachnamensargumente hat, nämlich 1:
project(MyProject C CXX)
Dies sollte beim Hinzufügen einer CMake-Datei automatisch erfolgen, aber abhängig von der Reihenfolge, in der Sie die Dateien hinzugefügt haben, enthalten die Argumente möglicherweise nur C oder CXX.
Wenn Sie beispielsweise nur C als Sprachargument und Ihre int main()
in Ihrer main.cpp war, wird Ihr Programmeintrittspunkt nicht existieren und Ihr Compiler wird einen Fehler auslassen.
1 Oder Sie können die Sprachargumente weglassen, in diesem Fall werden die Standardargumente von C und CXX ausgewählt. Sehen hier
Namen53
Der Unterschied zwischen g++ und gcc besteht im Wesentlichen darin, dass g++ -lstdc++ an den Linker übergibt. Fügen Sie einfach die C++-Standardbibliothek als explizite Abhängigkeit der C++-Module hinzu.
Um es klar zu sagen, gcc kann C++-Code kompilieren. gcc und g++ sind in dieser Hinsicht gleich. Der Unterschied besteht nur darin, dass Sie bei der Verwendung von g++ den Compiler nicht explizit anweisen müssen, auf libstdc++ zu linken.
-
Danke, ich habe die Frage umgeschrieben. Dieser Teil ist in Ordnung, aber ich würde gerne wissen, wie man gcc/g++ für bestimmte Unterverzeichnisse angibt.
– Cartesius00
11. November 2011 um 16:43 Uhr
-
Was ist die Notwendigkeit, g ++ für einige Unterverzeichnisse zu verwenden, wenn Sie nur gcc verwenden und sich bei Bedarf explizit auf libstdc ++ verlassen können?
– Namen53
11. November 2011 um 16:52 Uhr
-
@James: gcc kann als Frontend für g++ fungieren: Der Compiler wird aus der Dateierweiterung ausgewählt
– Christoph
11. November 2011 um 17:54 Uhr
-
Danke, ich habe die Frage umgeschrieben. Dieser Teil ist in Ordnung, aber ich würde gerne wissen, wie man gcc/g++ für bestimmte Unterverzeichnisse angibt.
– Cartesius00
11. November 2011 um 16:43 Uhr
-
Was ist die Notwendigkeit, g ++ für einige Unterverzeichnisse zu verwenden, wenn Sie nur gcc verwenden und sich bei Bedarf explizit auf libstdc ++ verlassen können?
– Namen53
11. November 2011 um 16:52 Uhr
-
@James: gcc kann als Frontend für g++ fungieren: Der Compiler wird aus der Dateierweiterung ausgewählt
– Christoph
11. November 2011 um 17:54 Uhr