2017-02-17 7 views
1

Ich installierte GNUStep und gobjc in Ubuntu 16.04. Ich kann Objective-C Code wie folgt zusammenstellen:Wie kompiliere ich Objective C++ in GCC?

gcc codefile.m `gnustep-config --objc-flags` -lobjc -lgnustep-base -o codefile 

Aber ich will Objective-C++ Code in GCC kompilieren. Wie kann ich es tun?

Antwort

3

Documentation of objc/objc++ dialects in GCC von Ihrem version of gcc/gobjc nicht bestimmte Option zur Auswahl der Dialekt-Variante.

Verwenden Sie einfach Standard-Dateierweiterung „.mm“ oder „.M“ (zusätzlich können Sie gcc mit g++ ersetzen automatisch C hinzufügen ++ Bibliotheken in der Stufe verknüpft, beide Varianten nicht getestet):

gcc codefile.mm `gnustep-config --objc-flags` -lobjc -lgnustep-base -o codefile 
g++ codefile.mm `gnustep-config --objc-flags` -lobjc -lgnustep-base -o codefile 

Und ObjC++ ist "simply source code that mixes Objective-C classes and C++ classes"

Gcc-Modus basierend auf Dateierweiterung wählen wird, gibt es große Tabelle von Dateierweiterungen und entsprechenden Sprach Modi mit Objective-C für .m und Objective-C++ für .mm/.M: https://github.com/gcc-mirror/gcc/blob/gcc-4_7_4-release/gcc/gcc.c#L913

static const struct compiler default_compilers[] = 
{ 
    /* Add lists of suffixes of known languages here. If those languages 
    were not present when we built the driver, we will hit these copies 
    and be given a more meaningful error than "file not used since 
    linking is not done". */ 
    {".m", "#Objective-C", 0, 0, 0}, {".mi", "#Objective-C", 0, 0, 0}, 
    {".mm", "#Objective-C++", 0, 0, 0}, {".M", "#Objective-C++", 0, 0, 0}, 
    {".mii", "#Objective-C++", 0, 0, 0}, 
. . . 
    /* Next come the entries for C. */ 
    {".c", "@c", 0, 0, 1}, 

Es gibt auch -x Möglichkeit g++ mit erlaubt Argument der "Objective-C++" manuell wählen Sprache Dialekt (gcc -x objective-c++ ... oder g++ -x objective-c++): https://github.com/gcc-mirror/gcc/blob/1cb6c2eb3b8361d850be8e8270c597270a1a7967/gcc/cp/g%2B%2Bspec.c#L167

case OPT_x: 
. . . 
     && (strcmp (arg, "c++") == 0 
     || strcmp (arg, "c++-cpp-output") == 0 
     || strcmp (arg, "objective-c++") == 0 

Es befindet sich auf https://gcc.gnu.org/onlinedocs/gcc/Overall-Options.html dokumentiert

-x language 

Geben Sie explizit die Sprache für die folgenden Eingabedateien an (anstatt dass der Compiler basierend auf dem Dateinamen-Suffix einen Standardwert auswählt). Diese Option gilt für alle folgenden Eingabedateien bis zur nächsten Option -x. Mögliche Werte für Sprache sind:

+1

Meine Erfahrung mit Objective-C++ zu macOS begrenzt ist, aber die Datei mit der Erweiterung .mm benannt werden muss, sonst wird es nicht funktionieren. Ich denke, das ist die richtige Antwort. –

+1

@osgx Danke für Ihre Detailinformationen. Ich könnte Objective-C++ mit 'g ++' so kompilieren: '' g ++ Codedatei.mm 'gnustep-config --objc-flags' -lobjc -lgnustep-base -o Codedatei''. –

+0

@ H.Al-Amri Mit clang auf macOS können Sie das '-ObjC++ 'Flag beim Kompilieren verwenden. Dies überschreibt die dateibasierte Moduserkennung. – Clearer