#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:
Я решил эту проблему:
- Вы должны установить для параметра «В соответствии с типом файла» значение «Дополнять исходные тексты как»,
- Установите «-ObjC » в «Другие флаги компоновщика»
- Последнее, вы должны изменить суффикс файлов на .mm, которые ссылаются на библиотечный метод
Ответ №4:
ну, на вкладке «Этапы сборки» есть раздел «Скомпилировать исходные тексты». Компиляция исходников«………..» Для файла, который вы хотите использовать компилятором Objective-C , добавьте флаг: -xobjective-c
протестировано в Xcode 12.5
Комментарии:
1. Я бы сказал, что принятый ответ намного лучше, чем это решение. Использование
.mm
расширения также позволяет всем разработчикам, работающим с файлами, использовать Objective-C , и если эти файлы когда-либо использовались в другой цели или проекте, они автоматически будут использовать правильный язык.2. зависит. Если тот же cpp-файл используется также на другой платформе и внутри via defines заблокированы некоторые его части в зависимости от платформы, у вас нет выбора. Вы должны использовать этот флаг, потому что .mm не будет хорошо принят в Linux или Windows.