2017-02-17 5 views
1

Я установил GNUStep и gobjc в Ubuntu 16.04. Я могу скомпилировать Objective-C код следующим образом:Как скомпилировать Objective C++ в GCC?

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

Но я хочу скомпилировать код Objective-C++ в GCC. Как мне это сделать?

ответ

3

Documentation of objc/objc++ dialects in GCCversion 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 будет выбрать режим на основе расширения файла, существует огромная таблица расширений файлов и соответствующих режимов языка с Objective-C для .m и 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}, 

Существует также -x вариант g++ с допустимым аргументом "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. Возможные значения для языка являются:

+1

Мой опыт работы с Objective-C++ ограничено MacOS, но должен быть назван с расширением .mm файл, в противном случае он не будет работать. Я думаю, что это правильный ответ. –

+1

@osgx Спасибо за подробную информацию. Я мог бы скомпилировать Objective-C++ с помощью 'g ++' следующим образом: '' g ++ codefile.mm 'gnustep-config --objc-flags' -lobjc -lgnustep-base -o codefile''. –

+0

@ H.Al-Amri С clang on macOS вы можете использовать флаг '-ObjC++ 'при компиляции. Это переопределит обнаружение режима на основе имени файла. – Clearer