Как скомпилировать определенные файлы в objective-c и остальную часть проекта в objective-c

#objective-c #xcode #compilation #objective-c #conditional-compilation

#objective-c #xcode #Сборник #objective-c #условная компиляция

Вопрос:

В настоящее время я занят над проектом, где мне нужно использовать внешнее вспомогательное устройство для чтения тегов Mifare 1k.

Аксессуар был предоставлен с пакетом SDK, написанным на (Objective?) C , и я следовал предоставленным инструкциям, чтобы установить для XCode значение «Компилировать исходные коды как: Objective-C » и добавил «-Obj-C » в «Другие флаги компоновщиков».

Тогда SDK компилируется нормально, но проблема в том, что я уже использую несколько библиотек в проекте (таких как ASIHTTPRequest, JSONKit, …), и у меня возникают проблемы с компиляцией из-за этих новых настроек в этих библиотеках. Если я вернусь к предыдущим настройкам, у меня возникнут проблемы с компиляцией в SDK для чтения

Вопрос в том, есть ли способ скомпилировать только класс из SDK как C , а остальной проект как objective-c?

Редактировать: файлы SDK состоят только из .h (и связанной библиотеки)

спасибо за твою помощь, Майк

Комментарии:

1. У вас действительно возникают ошибки компиляции или компоновщика? Предоставление фактических ошибок может помочь сгенерировать лучшие ответы

2. Имеются ошибки компиляции, в основном преобразования — Достижимость.m: 200: ошибка: недопустимое преобразование из ‘BOOL’ в ‘NetworkStatus’ — ASIHTTPRequest / ASIHTTPRequest.m:443:0 ASIHTTPRequest / ASIHTTPRequest.m:443: ошибка: недопустимое преобразование из ‘const void *’ в ‘const uint8_t * ‘ …

Ответ №1:

Выберите файл, который вы хотите скомпилировать как Objective C , в файловом навигаторе, а затем выберите тип файла в представлении инспектора файлов. Это в Xcode 4, но аналогичный механизм есть и в Xcode 3.

Выбор типа файла в инспекторе файлов

Комментарии:

1. спасибо за ваш ответ, я попробую это, если у меня возникнут проблемы с решением, которое я нашел. (на данный момент разделяется в вопросе)

2. Спасибо! В моем случае не удалось изменить расширение файла, поскольку код был общим для Windows / Mac #ifdef’d code. Установка флага -ObjC для исходного файла в Xcode также не работала у меня, но это решение сработало.

Ответ №2:

Попробуйте переименовать файлы, в которые вы включаете заголовки библиотеки, в MyClass.h для интерфейса и myClass.mm для файлов реализации. Это вынуждает файлы компилироваться как objective-c .

Комментарии:

1. спасибо за ваш ответ, но у меня доступны только заголовки (и связанная библиотека). Могу ли я что-то еще сделать?

2. Файлы класса, в который вы включаете заголовки, называются следующим образом: MyClass.h myClass.mm ?

3. У меня пока ничего не импортировано, это просто путем изменения флагов компиляторов и опции «компилировать исходный код как»

4. Попробуйте снова изменить флаги компилятора, он должен скомпилироваться нормально, если вы нигде не включили заголовки библиотеки. Затем попробуйте сделать это в соответствии с моими инструкциями.

5. спасибо за вашу помощь, я нашел другое решение, которое, похоже, компилируется (поделитесь в вопросе на данный момент)

Ответ №3:

Я решил эту проблему:

  1. Вы должны установить для параметра «В соответствии с типом файла» значение «Дополнять исходные тексты как»,
  2. Установите «-ObjC » в «Другие флаги компоновщика»
  3. Последнее, вы должны изменить суффикс файлов на .mm, которые ссылаются на библиотечный метод

Ответ №4:

ну, на вкладке «Этапы сборки» есть раздел «Скомпилировать исходные тексты». Компиляция исходников«………..» Для файла, который вы хотите использовать компилятором Objective-C , добавьте флаг: -xobjective-c

протестировано в Xcode 12.5

Комментарии:

1. Я бы сказал, что принятый ответ намного лучше, чем это решение. Использование .mm расширения также позволяет всем разработчикам, работающим с файлами, использовать Objective-C , и если эти файлы когда-либо использовались в другой цели или проекте, они автоматически будут использовать правильный язык.

2. зависит. Если тот же cpp-файл используется также на другой платформе и внутри via defines заблокированы некоторые его части в зависимости от платформы, у вас нет выбора. Вы должны использовать этот флаг, потому что .mm не будет хорошо принят в Linux или Windows.