如何在 GCC 中编译 Objective C++?
How to compile Objective C++ in GCC?
我在 Ubuntu 16.04 中安装了 GNUStep 和 gobjc
。我可以像这样编译 Objective-C 代码:
gcc codefile.m `gnustep-config --objc-flags` -lobjc -lgnustep-base -o codefile
但我想在 GCC 中编译 Objective-C++ 代码。我该怎么做?
Documentation of objc/objc++ dialects in GCC of your version of gcc / gobjc 不列出 select 方言变体的特定选项。
只需使用标准文件扩展名“.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 会根据文件扩展名 select 模式,有大量 table 的文件扩展名和相应的语言模式 Objective-C for .m
and Objective-C++ .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},
还有 g++
的 -x
选项,允许参数 "objective-c++" 手动 select 语言方言(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
Specify explicitly the language for the following input files (rather than letting the compiler choose a default based on the file name suffix). This option applies to all following input files until the next -x option. Possible values for language are:
c . . . c++ . . .
objective-c objective-c-header objective-c-cpp-output
objective-c++ objective-c++-header objective-c++-cpp-output
我在 Ubuntu 16.04 中安装了 GNUStep 和 gobjc
。我可以像这样编译 Objective-C 代码:
gcc codefile.m `gnustep-config --objc-flags` -lobjc -lgnustep-base -o codefile
但我想在 GCC 中编译 Objective-C++ 代码。我该怎么做?
Documentation of objc/objc++ dialects in GCC of your version of gcc / gobjc 不列出 select 方言变体的特定选项。
只需使用标准文件扩展名“.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 会根据文件扩展名 select 模式,有大量 table 的文件扩展名和相应的语言模式 Objective-C for .m
and Objective-C++ .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},
还有 g++
的 -x
选项,允许参数 "objective-c++" 手动 select 语言方言(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
Specify explicitly the language for the following input files (rather than letting the compiler choose a default based on the file name suffix). This option applies to all following input files until the next -x option. Possible values for language are:
c . . . c++ . . . objective-c objective-c-header objective-c-cpp-output objective-c++ objective-c++-header objective-c++-cpp-output