Kompilieren von C- und C++-Dateien zusammen mit GCC

Lesezeit: 3 Minuten

Ich versuche, C- und C++-Quellen zusammen mit GCC zu kompilieren.

gcc -std=c++0x test.cpp -std=c99 test.c -lstdc++

Nun, das funktioniert gut, außer dass ich zwei Warnungen bekomme.

cc1plus: warning: command line option "-std=c99" is valid for C/ObjC but not for C++
cc1: warning: command line option "-std=c++0x" is valid for C++/ObjC++ but not for C

Daher kann ich nicht verwenden -Werror mit dieser einstellung. Kann man diese Warnungen irgendwie unterdrücken?

  • Was du denken Sie tun, ist sehr unterschiedlich von was tust du. Sie setzen den Sprachstandard zuerst auf C++0x und dann auf C99, was der Verwendung von C99 für entspricht beide Dateien. Das Kompilieren von C++ im C99-Modus ist jedoch unmöglich, daher für die .cpp -Datei, greift der Compiler auf seine Standardeinstellung zurück, die C++98 ist. Sie kompilieren daher die C-Datei in C99 und die C++-Datei in C++98. Beim Analysieren von Optionen erkennt GCC, dass Sie inkompatible Dateien für beide Sprachversionsoptionen haben, und gibt daher Warnungen für jede Option aus.

    – Dämon

    1. Oktober 2013 um 15:17 Uhr

Die Dateien separat kompilieren, mit g++ verknüpfen

gcc -c -std=c99 -o file1.o file1.c
g++ -c -std=c++0x -o file2.o file2.cpp
g++ -o myapp file1.o file2.o

  • Ja, sicher, aber ich muss es in einem GCC-Aufruf kompilieren. Ich verwende eine API zum Aufrufen von GCC und kann nur Flags hinzufügen.

    – Simon Toth

    25. März 2011 um 9:46 Uhr


  • @Let_Me_Be: Dann müssen Sie entweder ein Skript/einen Wrapper schreiben und diesen aufrufen oder Ihr c als c++ kompilieren, ohne C99 anzugeben

    – Erich

    25. März 2011 um 9:55 Uhr

  • Hmm, ich könnte den C++-Teil tatsächlich vorkompilieren (da sich das nicht ändern wird) 🙂

    – Simon Toth

    26. März 2011 um 13:27 Uhr

  • Wenn Sie Angst haben, .o von verschiedenen Compilern miteinander zu verknüpfen, können Sie verwenden g++ -x c Anstatt von gcc.

    – Gabriel Devillers

    17. Dezember 2017 um 12:17 Uhr

Wenn sich jemand fragt, wie man dies am besten in Android macht, ist es dies:

LOCAL_CFLAGS := -Werror
LOCAL_CONLYFLAGS := -std=gnu99
LOCAL_CPPFLAGS := -std=c++0x

Benutzeravatar von orlp
Orlp

gcc ist der C-Compiler und g++ ist der C++-Compiler. Sie mischen die beiden Sprachen mit unterschiedlichen Stilen. Auseinander kompilieren und dann verlinken:

gcc -std=c99 -c -o test.c.o test.c
g++ -std=c++0x -c -o test.cpp.o test.cpp
g++ -o executable test.cpp.o test.c.o

  • Du brauchst ein Extra = und ein -c in Ihrer g++ Kompilierungszeile.

    – Erich

    25. März 2011 um 9:42 Uhr

Dies ist sehr relevant für Android NDK. Glücklicherweise gibt es einen hässlichen Workaround. Um alle C-Dateien als kompiliert zu machen c99und alle CPP-Dateien als c++0xfügen Sie der Android.mk-Datei die folgenden Zeilen hinzu:

LOCAL_CPPFLAGS += -std=c++0x
LOCAL_C99_FILES := $(filter %.c, $(LOCAL_SRC_FILES))
TARGET-process-src-files-tags += $(call add-src-files-target-cflags, $(LOCAL_C99_FILES), -std=c99)

Dies funktioniert im neuesten NDK r8b mit der Toolchain arm-linux-androideabi-4.6, aber ich kann nicht garantieren, dass es in zukünftigen Versionen funktioniert, und ich habe es nicht mit früheren Versionen getestet.

Ich bin auch auf dieses Problem gestoßen. Ich habe keinen Weg gefunden, c und c++ mit einem Einzeiler zu kompilieren, aber mit autotools autoconf wird es die richtige Konfiguration und Makefile für jede .c und .cpp oder .cc generieren, um sie einzeln zu kompilieren und sie dann zu verknüpfen.
https://www.gnu.org/software/automake/manual/html_node/Autotools-Introduction.html

Benutzeravatar von abunickabhi
abunickabhi

Anstatt gcc zu verwenden, verwenden Sie g++.

Das gilt für beide Dateitypen, .cpp- und .c-Dateien.

Versuchen Sie, cpp in c einzuschließen oder umgekehrt, und verwenden Sie dann g ++ zum Kompilieren. Ich denke, GNU wird es automatisch als Header-Datei kompilieren.

1389960cookie-checkKompilieren von C- und C++-Dateien zusammen mit GCC

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

Privacy policy