ios — проблемы анализа в NSObjCRuntime, NSZone и NSObject

Я использую AddThis, чтобы добавить параметры общего доступа в мое приложение для iOS.

Я импортировал классы и добавил флаг -fno-objc-arc ко всем импортированным классам, поскольку они не используют ARC.

Однако, когда я пытаюсь запустить приложение, я получаю множество проблем с разбором, таких как:

Expected identifier or '('
Unknown type name 'NSString'
Unknown type name 'Protocol'
...

Эти ошибки возникают в NSObjCRuntime, NSZone и NSObject. У меня также есть необходимые рамки. Любые идеи?

Включите это изображение, если это поможет: image


person soleil    schedule 08.08.2012    source источник
comment
Вы пытаетесь сделать это в файле c?   -  person CodaFi    schedule 08.08.2012
comment
Не уверен, что вы имеете в виду, но в библиотеке есть один файл .c, который называется Base64Transcoder.c.   -  person soleil    schedule 08.08.2012
comment
Похоже, здесь та же проблема: stackoverflow.com/questions/7654752/, но решения нет. Предполагая, что у меня есть один файл .c, как мне обойти это?   -  person soleil    schedule 08.08.2012
comment
Проблемы возникают только тогда, когда вы пытаетесь связать структуры ObjC с файлами C (по крайней мере, по моему опыту). Импортирует ли Base64.c какие-либо фреймворки?   -  person CodaFi    schedule 08.08.2012


Ответы (6)


У меня была такая же проблема в моем проекте, когда я пытался смешать код C (.h и .c) с кодом Objective-C. Нашел причину проблемы:

Проверьте файл .pch, чтобы убедиться, что каждый #import фреймворка Objective-C (например, #import <UIKit/UIKit.h>) заключен в:

#ifdef __OBJC__

#endif

Если они находятся за пределами этой условной области, компилятор попытается импортировать фреймворки Objective-C в исходный код C.

Надеюсь, это поможет.

person horacex    schedule 05.11.2012
comment
Большое спасибо, только что избавил меня от часовой головной боли прямо здесь! Вы должны задаться вопросом, если проблема в том, что вы пытаетесь импортировать фреймворки Objective-C в код C, почему они об этом не говорят? Почему XCode генерирует загадочные сообщения об ошибках, которые почти бессмысленны? В любом случае, спасибо!!! И да, я поместил все свои импорты в файл .pch внутри ifdef, и все заработало. - person n13; 10.05.2013
comment
пожалуйста. это именно ценность этого сообщества. Мне от этого больше помогло :) - person horacex; 13.06.2013
comment
СПАСИБО! Подписчики, также убедитесь, что не #define NSStrings или const. NSNumbers вне блока OBJC! - person Raffael; 28.12.2013
comment
Это было именно причиной моей проблемы. Спасибо - person Tim Kane; 27.07.2014
comment
Чувак, ты классный. Большое Вам спасибо. :) - person Ankur Arya; 03.03.2015
comment
У меня нет PCH, что мне делать? - person moonman239; 27.03.2016
comment
Большое спасибо @horacex - person Jeba Moses; 26.05.2017
comment
Решил мою проблему, спасибо - person Hassy; 29.05.2017

Я только что изменил имя файла Base64Transcoder.c на Base64Transcoder.m, и теперь проект компилируется. Я понятия не имею, почему это решает проблему, но это работает.

person soleil    schedule 08.08.2012
comment
Я предполагаю, что это было. Вы превратили свой файл c в файл Objective-C, поэтому после этого импорт фреймворков Objective-C заработал. Самое интересное, что файл .pch импортируется во все файлы c, а также в файлы obj-c, поэтому, если в файле pch есть незащищенный импорт obj-c, вы получите это идиотское сообщение об ошибке. - person n13; 10.05.2013
comment
Невероятный. Большое спасибо. - person PKCLsoft; 20.03.2017

У меня была та же проблема с использованием кода C и C++ с целью C, и у меня нет .pch. Самым простым решением было зайти в настройки сборки -> Пользовательские флаги компилятора и установить «Другие флаги C» на «-x цель -c" и установите "Другие флаги C++" на "-x target-c++"

это поможет с xCode 7.2

person Bastien    schedule 04.02.2016
comment
У меня сработала настройка C++, в моем проекте не было файлов .pch и .c, Xcode 7.2.1. - person Corbell; 15.05.2017

У меня была такая же проблема, когда мой проект содержал файлы .cpp.

Если файл .cpp не содержит фреймворков ObjectiveC (например), он должен иметь тип «Исходный код по умолчанию на C++».

введите здесь описание изображения,

но если файл .cpp имеет фреймворки ObjectiveC - он должен быть как "Источник Objective-C++"

введите здесь описание изображения

person gaRik    schedule 03.07.2014

TLDR: если ваш файл PCH в порядке, просмотрите заголовки файла CPP, чтобы убедиться, что вы случайно не включили какие-либо заголовки для объектов Objective C.

Подробности: я получил это, потому что я случайно включил заголовок класса Objective-C в заголовок класса C++, косвенно. Структура была такой:

Compass.h определил чистый класс Objective C.

ActionTracker.h определил класс C++, который понимает конструкции Objective C (через ActionTracker.mm).

HelloWorld.h определяет чисто класс C++.

В моей первоначальной настройке HelloWorld.h включал ActionTracker.h, но это было нормально, поскольку ActionTracker.h еще не содержал Compass.h. Позже я изменил свой код и включил Compass.h в ActionTracker.h, который затем втянул его в HelloWorld.h, и я получил эти ошибки.

person user1469569    schedule 15.06.2014

У меня была такая же проблема, когда я пытался переместить файл info.plist из одного каталога в другой. Это каким-то образом заставило XCode отредактировать этапы сборки для этой цели и значительно увеличило количество «Компилировать источники» и «Копировать ресурсы пакета».

К счастью, у моего проекта есть несколько целей, которые я использую для тестирования (например, демо-версия приложения, разработка приложения, локальное приложение, приложение 1.1, приложение 1.2 и т. д.).

Поэтому я просто продублировал одну из незатронутых целей и переименовал ее (также переименовал идентификатор пакета и схему сборки), и это, очевидно, решило проблему для меня, поскольку затронут не весь проект, а только эта конкретная цель.

Если вы хотите попробовать мое решение, попробуйте создать новую цель с нуля или продублировать и переименовать любую из незатронутых вами целей.

person Community    schedule 07.11.2014