2017-02-17 9 views
1

Ubuntu 16.04にGNUStepとgobjcをインストールしました。私はこのようなObjective-CのコードをコンパイルすることができますGCCでObjective C++をコンパイルするには?

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

しかし、私はGCCでのObjective-C++コードをコンパイルしたいです。どうしたらいいですか?あなたのversion of gcc/gobjc

答えて

3

Documentation of objc/objc++ dialects in GCC方言バリアントを選択するための特定のオプションが表示されません。

ただ、「.mm」または「.M」(さらにあなたは、自動的に、ステージをリンクにC++ライブラリを追加するg++gccを置き換えることができ、両方のバリアントは、テストされていない)標準のファイル拡張子を使用します。

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

とにObjC++です"simply source code that mixes Objective-C classes and C++ classes"

GCCは、ファイルの拡張子に基づいてモードを選択します

.mm/.Mため.mとObjective-C++のためのObjective-Cでのファイル拡張子と対応する言語モードの巨大なテーブルがあります: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}, 

"Objective-Cの++" に手動で選択言語の方言(gcc -x objective-c++ ...またはg++ -x objective-c++)の許可引数でg++-xオプションもあります。 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 

それはhttps://gcc.gnu.org/onlinedocs/gcc/Overall-Options.html

で文書化されては、
-x language 

次の入力ファイルの言語を明示的に指定します(ファイル名の接尾辞に基づいてコンパイラにデフォルトを選択させるのではなく)。このオプションは、次の-xオプションまで続くすべての入力ファイルに適用されます。言語のための可能な値は以下のとおりのObjective-C++で

+1

私の経験では、MacOSのに制限されているが、ファイルがそれ以外の場合は動作しません、拡張子.mmで命名する必要があります。私はこれが正解だと思う。 –

+1

@osgx詳細情報をお寄せいただきありがとうございます。 Objective-C++を 'g ++'で '' g ++ codefile.mm 'gnustep-config --objc-flags' -lobjc -lgnustep-base -o codefile''とコンパイルすることができました。 –

+0

@ H.Al-Amri macOSでclangを使うと、コンパイル時に '-ObjC++'フラグを使うことができます。これは、ファイル名ベースのモード検出を無効にします。 – Clearer

関連する問題