Verknüpfen von C aus C ++ in OS X Mavericks

8

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.

    
stephen f 28.10.2013, 20:49
quelle

3 Antworten

15

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%     
AbePralle 22.06.2014 03:37
quelle
5

Hier ist ein Beispiel Makefile , das C++ code / function in einem Programm C verwendet.

%Vor%

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.

  • Makefile
  • main.c
  • CPP.h
  • CPP.cpp

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 :

%Vor%

CPP.cpp :

%Vor%

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.

    
Calvin Cheng 24.04.2015 03:43
quelle
1

Höchstwahrscheinlich bist du ein Opfer von Name mangling . Um Namensfehlern in C ++ zu vermeiden, verwenden Sie extern "C" um Deklarationen wie:

%Vor%     
Inspired 28.10.2013 21:40
quelle

Tags und Links