Mischen von C und C++ mit CMAKE

Lesezeit: 3 Minuten

Benutzer-Avatar
Cartesius00

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.

Benutzer-Avatar
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.txtverwenden project(myproject) statt zu sagen project(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

Benutzer-Avatar
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

1383020cookie-checkMischen von C und C++ mit CMAKE

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy