如何在GCC中编译Objective C ++?

时间:2017-02-17 22:33:05

标签: linux gcc g++ objective-c++

我在Ubuntu 16.04中安装了GNUStep和gobjc。我可以像这样编译Objective-C代码:

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

但我想在GCC中编译Objective-C ++代码。我该怎么办?

1 个答案:

答案 0 :(得分:4)

Documentation of objc/objc++ dialects in GCC您的version of gcc / gobjc不列出特定选项以选择方言变体。

只需使用标准文件扩展名" .mm"或" .M" (另外,您可以将gcc替换为g++以自动将C ++库添加到链接阶段;两个变体都未经测试):

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将根据文件扩展名选择模式,有.m的Objective-C和.mm / .M的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},

-x还有g++选项,允许参数为#34; objective-c ++"手动选择语言方言(gcc -x objective-c++ ...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

记录于https://gcc.gnu.org/onlinedocs/gcc/Overall-Options.html

 -x language
     

明确指定以下输入文件的语言(而不是让编译器根据文件名后缀选择默认值)。此选项适用于所有后续输入文件,直到下一个-x选项。语言的可能值为:

      c  . . .  c++ . . .
      objective-c  objective-c-header  objective-c-cpp-output
      objective-c++ objective-c++-header objective-c++-cpp-output