Nachdem ich zu OS X Mavericks und XCode 5.0.1 übergegangen bin, kann ich compilierte C-Dateien (Ausgabe von gcc) nicht mehr elegant mit einem C ++ - Projekt verknüpfen (Ausgabe von g ++).
Das beleidigende Paar von Befehlen, die von meinem Makefile erzeugt werden, sind:
%Vor%Zu dem der Linker klagt:
Nicht definierte Symbole für Architektur x86_64: "load_dmat (char const *)", referenziert von: _main in Layoutqualität-I8HOqy.o ld: Symbol (e) nicht für Architektur x86_64
gefunden
Dabei ist load_dmat
nur eine Funktion in der Datei vec.c. Wenn ich die gcc
durch g++
in der ersten Zeile ersetze, dann wird alles kompiliert und verlinkt, aber clang sagt:
clang: warning: Behandlung von 'c' Eingabe als 'C ++' wenn im C ++ Modus dieses Verhalten veraltet ist
Gibt es eine ungefährliche, nicht veraltete Methode, diese zu kompilieren und zu verknüpfen? Die Verknüpfung mit g++
zusammen mit Objektdateien von gcc
funktionierte einwandfrei, bevor ich auf OS X Mavericks und die neuen Befehlszeilentools upgraden konnte. Jeder Einblick in was sich geändert hat und wie man vorwärts geht, wäre großartig, danke.
Hinzufügen eines "-x c" (ohne Anführungszeichen) vor "vecc.c" sollte es beheben.
Wenn Sie mehrere .c / .cpp-Dateien in derselben Zeile kompilieren, können Sie "-x c" oder "-x c ++" vor jeder Liste von C- oder C ++ - Dateinamen verwenden, um den Kontext entsprechend zu wechseln. Zum Beispiel:
%Vor% Hier ist ein Beispiel Makefile
, das C++
code / function in einem Programm C
verwendet.
Wie Sie sehen, generieren wir unsere Objekte separat mit CXXFLAGS
und CFLAGS
in zwei separaten Aufrufen an den Compiler. Im Kontext von Mac mit Xcode's Clang, sind clang ( CC
) und clang ++ ( CXX
) eigentlich dasselbe. Nur die unterschiedlichen Flaggen sind wichtig. Ich bin nur pedantisch, indem ich die Definitionen von CC
und CXX
im obigen Beispiel Makefile
festlege.
Sobald die Objektdateien erzeugt sind, können wir sie verlinken.
Beachten Sie jedoch, dass Sie einen zusätzlichen Schritt ausführen müssen, damit Ihr C++
-Code vom C-Programm verwendet werden kann.
In CPP.h
in diesem Beispiel müssen Sie explizit extern "C"
verwenden, um die Verknüpfung für Ihren C++
Code für die Verwendung von C
zu spezifizieren.
Zum Beispiel so:
%Vor% Die Präprozessor-Makros #ifdef __cplusplus
und #endif
sollen sicherstellen, dass unsere Header-Datei keine C-Modus-Kompilierungsfehler verursacht und nur während der C ++ - Modus-Kompilierung wirksam ist.
Dieses vollständige Beispiel enthält nur 4 Dateien.
Die Makefile
Quelle und CPP.h
sind oben erklärt.
Für ein vollständiges Verständnis schließe ich auch main.c
und CPP.cpp
ein.
main.c
:
CPP.cpp
:
Ich vertraue darauf, dass diese Erklärung und dieses Beispiel klarstellen, wie wir unsere Makefile
einrichten, das #ifdef __cplusplus
Präprozessormakro und die extern "C"
Verknüpfungsdeklaration angeben können, um C ++ - to-C Interop zuzulassen und wann keine fälschliche Clamwarnung erscheint wir laufen machen.
Höchstwahrscheinlich bist du ein Opfer von Name mangling . Um Namensfehlern in C ++ zu vermeiden, verwenden Sie extern "C"
um Deklarationen wie:
Tags und Links c c++ gcc clang osx-mavericks