Xcode 4 не удается найти общедоступные файлы заголовков из зависимости статической библиотеки


альтернативные названия для помощи в поиске

  • Xcode не может найти заголовок
  • отсутствует .h в Xcode
  • Xcode .H-файл не найден
  • лексические или препроцессора вопрос не найден файл

я работаю над проектом приложения iOS, который пришел из Xcode 3. Теперь я перешел на Xcode 4 Мой проект строит ряд статических библиотек.

эти статические библиотеки объявить публичные заголовки и эти заголовки используются в коде приложения. В Xcode 3.X заголовки были скопированы (как этап сборки) в public headers directory, затем в проекте приложения public headers directory добавлен headers search list.

под Xcode 4 каталог сборки перемещается в ~/Library/Developer/Xcode/DerivedData/my-project.

проблема в том, как я могу ссылаться на это новое местоположение в настройках поиска заголовков? Кажется, что:

  • public headers directory относительно
17 90

17 ответов:

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

короткий ответ:

добавьте следующий путь к вашему Пути Поиска Заголовка Пользователя

" $(BUILD_ROOT)/../IntermediateBuildFilesPath/UninstalledProducts"

почему это работа?

во-первых, мы должны понять проблему. При нормальных обстоятельствах, то есть когда вы запускаете, тестируете, Профилируете или анализируете, Xcode строит ваш проект и помещает вывод в Build/Products/конфигурация/каталог продуктов, который доступен через $BUILT_PRODUCTS_DIR макрос.

большинство руководств по статическим библиотекам рекомендуют устанавливать Путь К Папке Public Headers до $имя, которым означает, что ваш lib файл становится $BUILT_PRODUCTS_DIR / libTargetName.а ваши заголовки помещаются в $BUILT_PRODUCTS_DIR / TargetName. Как долго, как ваше приложение включает в себя $BUILT_PRODUCTS_DIR в своем пути поиска, то импорт будет работать в 4 ситуациях, приведенных выше. Однако это не будет работать при попытке архивирования.

Архивация работает немного по-другому

при архивировании проекта Xcode использует другую папку с именем ArchiveIntermediates. В этой папке вы найдете /YourAppName/BuildProductsPath/Release-iphoneos/. Это папка, которая $BUILT_PRODUCTS_DIR указывает на то, когда вы делаете архив. Если вы посмотрите туда, вы увидите, что есть символическая ссылка на ваш встроенный статический файл библиотеки, но папка с заголовками отсутствует.

чтобы найти заголовки (и файл lib), вам нужно перейти в IntermediateBuildFilesPath/UninstalledProducts/. Помните, когда вам сказали установить Пропустить Установите да для статических библиотек? Ну это эффект, который установка имеет, когда вы делаете архив.

Side Примечание: Если вы не установите его, чтобы пропустить установку, ваши заголовки будут помещены в еще одно место, и файл lib будет скопирован в ваш архив, предотвращая экспорт .файл, который вы можете отправить в магазин приложений.

после долгих поисков я не смог найти ни одного макроса, который соответствует папке UninstalledProducts именно поэтому необходимо построить путь с помощью "$(BUILD_ROOT)/../IntermediateBuildFilesPath/UninstalledProducts"

резюме

для статической библиотеки убедитесь, что вы пропустили установку и что ваши общедоступные заголовки помещены в $TARGET_NAME.

для вашего приложения установите пути поиска заголовка пользователя в "$(BUILT_PRODUCTS_DIR)", который отлично работает для обычных сборок, и "$(BUILD_ROOT)/../ IntermediateBuildFilesPath/UninstalledProducts", который работает для архив строит.

я столкнулся с этой же проблемой при разработке моей собственной статической библиотеки, и хотя ответ Колина был очень полезен, мне пришлось немного изменить его, чтобы работать последовательно и просто при запуске и архивировании проектов под Xcode 4 с использованием рабочей области.

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

мой метод заключается в следующем:

создать рабочее место

  1. Под Xcode 4, перейдите в Файл, Новый, рабочее пространство.
  2. из Finder вы можете перетащить в .проекты xcodeproj как для статической библиотеки, которую вы хотите использовать, так и для нового приложения, которое вы создаете, которое использует библиотеку. Дополнительную информацию о настройке рабочих пространств см. В разделе Apple Docs: https://developer.apple.com/library/content/featuredarticles/XcodeConcepts/Concept-Workspace.html

Настройки Проекта Статической Библиотеки

  1. убедитесь, что все статические заголовки библиотеки настроены на копирование в "Public". Это делается в разделе Настройки для статической библиотеки target > Build Phases. На этапе " копировать заголовки "убедитесь, что все ваши заголовки находятся в разделе" Public".
  2. Далее перейдите к настройкам сборки, найдите "путь к папке Public Headers" и введите путь для своей библиотеки. Я решил использовать это:

include/LibraryName

Я принял это от использования с RestKit и нашел, что это работает лучше всего со всеми моими статическими библиотеками. Это означает, что Xcode копирует все заголовки, которые мы переместили в раздел "общедоступные" заголовки на шаге 1 в указанную здесь папку, которая находится в папке производных данных при построении. Как и в RestKit, мне нравится использовать одну папку "include" для хранения каждой статической библиотеки, которую я использую в проекте.

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

  1. найти "пропустить установку" и убедитесь, что это установлено в да.

настройки для проекта с помощью статической библиотеки

  1. добавить статическую библиотеку в качестве фреймворка в разделе фазы сборки > связать двоичный файл с библиотеками и добавить libLibraryName.файл для любой статической библиотеки, которую вы хотите использовать.
  2. далее убедитесь, что проект настроен на поиск путей поиска пользователей. Это делается в разделе параметры сборки > Всегда искать пути пользователя и убедитесь, что его значение да.
  3. в той же области найти пути поиска заголовка пользователя и добавить:

    " $(PROJECT_TEMP_DIR)/../UninstalledProducts / include"

Это говорит Xcode искать статические библиотеки в промежуточной папке сборки, которую Xcode создает во время процесса сборки. Здесь у нас есть папка "include", которую мы используем для наших статических библиотек, которые мы настраиваем на Шаге 2 для статической библиотеки параметры проекта. Это самый важный шаг в получении Xcode, чтобы правильно найти статические библиотеки.

настройка рабочего пространства

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

  1. убедитесь, что вы выбрали схему, которая будет создавать ваше приложение.
  2. в раскрывающемся списке схема выберите Изменить Схема.
  3. выберите построить в верхней части списка слева. Добавьте новую цель, нажав кнопку + на средней панели.
  4. вы должны увидеть, что статическая библиотека отображается для библиотеки, которую вы пытаетесь связать. Выберите статическую библиотеку iOS.
  5. Нажмите кнопку Выполнить и архивировать. Это говорит о том, что схема компилирует библиотеки для статической библиотеки всякий раз, когда вы создаете свое приложение.
  6. перетащите статическую библиотеку выше целевого объекта приложения. Это делает статическое библиотеки компилируются перед целевым объектом приложения.

начните использовать библиотеку

теперь, вы должны быть в состоянии импортировать статическую библиотеку с помощью

import <LibraryName/LibraryName.h>

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

почему это работает?

все зависит от этого пути:

"$(PROJECT_TEMP_DIR)/../UninstalledProducts/include"

потому что мы настройте нашу статическую библиотеку на использование "пропустить установку", скомпилированные файлы будут перемещены в папку" UninstalledProjects " во временном каталоге сборки. Наш путь здесь также разрешает папку "include", которую мы устанавливаем для нашей статической библиотеки и используем для нашего пути поиска заголовка пользователя. Два работающих вместе позволяет Xcode знать, где найти нашу библиотеку во время процесса компиляции. Поскольку этот временный каталог сборки существует для конфигураций отладки и выпуска, вам нужен только один путь для Xcode для поиска статических библиотек.

проект Xcode 4 не может скомпилировать статическую библиотеку

вопрос: "лексический или препроцессорный файл проблемы не найден" в Xcode 4

ошибки могут включать; отсутствуют заголовочные файлы," лексическая или препроцессорная проблема"

решения:

  1. проверьте правильность "пути заголовка пользователя"
  2. установите для параметра" всегда искать пути пользователя " значение да
  3. создать групповой вызов "Индексирование заголовков" в вашем проекте и перетащите заголовки в эту группу,НЕ добавить к любым целям при появлении запроса.

Это была очень полезная тема. Исследуя свою собственную ситуацию, я обнаружил, что у Apple есть 12-страничный документ от сентября 2012 года под названием "использование статических библиотек в iOS."Вот ссылка pdf: http://developer.apple.com/library/ios/technotes/iOSStaticLibraries/iOSStaticLibraries.pdf

Это намного проще, чем большинство интернет-дискуссий, и с некоторыми небольшими модами для учета того, как настроены внешние библиотеки, которые я использую, это хорошо работает для мне. Самая важная часть, вероятно:

Если ваша целевая библиотека имеет этап сборки "копировать заголовки", вы должны удалите его; копирование заголовков фазы сборки не работают правильно со статическими цели библиотеки при выполнении действия "архив" в Xcode.

появятся новые цели статической библиотеки, созданные с помощью Xcode 4.4 или более поздней версии с соответствующим образом настроенной фазой копирования файлов для заголовков, так что вы следует проверить, если у вас уже есть один перед созданием один. Если вы этого не сделаете, нажмите "Добавить фазу сборки" в нижней части целевого редактора и выберите "Добавить файлы копирования."Раскройте новую сборку файлов копирования фаза и установите пункт назначения в " каталог продуктов."Набор Подпути чтобы включить/${PRODUCT_NAME}. Это позволит скопировать файлы в папку с именем после вашей библиотеки (взятой из параметра сборки PRODUCT_NAME), внутри папка с именем include, внутри вашего каталога встроенных продуктов. Этот включить папку внутри каталога продуктов сборки находится в по умолчанию пути поиска заголовков для приложений, так что это подходящее место поставить заголовочные файлы.

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

http://developer.apple.com/library/ios/#technotes/iOSStaticLibraries/Articles/creating.html

в документации Apple:

ваша библиотека будет иметь один или несколько заголовочных файлов, что клиенты этой библиотеки нужно импортировать. Чтобы настроить, какие заголовки экспортируются в клиенты, выберите проект библиотеки, чтобы открыть редактор проекта, выберите цель библиотеки, чтобы открыть редактор цели, и перейдите на вкладку этапы сборки. Если ваша библиотека цель имеет фазу сборки "копировать заголовки", вы должны удалить ее; фазы сборки" копировать заголовки "не работают правильно со статическими целями библиотеки при выполнении действия "архив" в Xcode.

взгляните на решение Ионы Wlliam (в середине пути вниз) и модель GitHub (в комментариях) для понимания. http://blog.carbonfive.com/2011/04/04/using-open-source-static-libraries-in-xcode-4/

добавить $(OBJROOT)/UninstalledProducts / exactPathToHeaders до Пути Поиска Заголовка.

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

под навигатором журнала в Xcode (вкладка справа от навигатора точек останова) вы можете увидеть историю сборки. Если вы выберете фактический сбой сборки, вы можете развернуть его детали, чтобы увидеть setenv Путь и проверьте, чтобы убедиться, что путь к вашим заголовочным файлам есть.

добавьте следующий путь к вашим путям поиска заголовка пользователя:

$(BUILD_ROOT)/../IntermediateBuildFilesPath/UninstalledProducts

Это проверено!

рискуя показать, какой я идиот... Я страдаю от того, что XCode отказывается найти мой .H-файлы весь день.

и тут я понял.

поскольку я использовал "XCode 4", я" разумно "решил поместить все мои проекты в подпапки папки под названием"проекты XCode 4".

эти пробелы в имени папки испортили XCode big-time !

переименование этой папки в"XCode_4_Projects" имеет принес радость (и меньше ругани) обратно в мою жизнь.

напомни мне еще раз,что год ?

возможно, кто-то мог бы сказать разработчикам Apple...

ни один из этих ответов работал для меня. Вот что получилось. Добавьте следующее точно (скопируйте и вставьте, включая двойные кавычки) в ваш Пути Поиска Заголовка Пользователя создать установка:

"$(BUILD_ROOT)/../IntermediateBuildFilesPath/UninstalledProducts/include/"

обратите внимание на добавление подкаталога "/include/" по сравнению с другими ответами. Как указывали другие пользователи, опция" рекурсивный", похоже, ничего не делает, поэтому вы можете игнорировать ее.

мой проект теперь смог успешно архивировать, когда импорт заголовочных файлов статической библиотеки в следующем виде:

#import "LibraryName/HeaderFile.h"

ты не нужно включить Всегда Искать Пути Пользователя установка, если вы не включаете ваши статические заголовки библиотеки с угловыми скобками (#import <LibraryName/HeaderFile.h>), но вы действительно не должны делать это так, если это не заголовок system/framework.

ни один из ответов выше не работал для меня на Xcode 7, но они дали мне хорошую идею. Для парней, борющихся на Xcode 7, я исправил это, добавив следующие пути поиска заголовка пользователя (включая кавычки)

"$(BUILT_PRODUCTS_DIR)/usr/local/include"

изменить относительную часть URL usr/local/include в соответствии с тем, что есть в настройке "путь к папке общего заголовка" статической библиотеки

в моем случае в моем рабочем пространстве было несколько статических библиотечных проектов, и один из них имеет зависимость, включая заголовочные файлы с другим. Вопрос был с порядком строительства . На странице редактирования схемы в разделе сборки я отключил параметр parallelize и упорядочил порядок целей в соответствии с зависимостями, и он решил проблему

это связанная с этим проблема, которая привела меня к этому вопросу, поэтому я добавляю свое решение строго для документации / это может сэкономить еще несколько часов потения души

DropboxSDK.H-файл не найден

после нескольких дней попыток получить VES для компиляции для iOS я в конечном итоге столкнулся с этой проблемой. элемент DropboxSDK.h был определенно в пределах досягаемости search headers Я даже добавил его в framework headers путь поиска, includeд .h сразу и пошел на все виды больших длин чтобы попытаться получить DropboxSDK.h нашли.

решение

явно перетащите DropboxSDK.framework файл в Xcode Project Navigation и убедится это. Также убедитесь, что ваша цель проверяется по мере необходимости.

предупреждение

установив четкие рамки в build phases не работает для меня. Я должен был перетащить the .рамки в Xcode и убедитесь, что файлы скопированы в мой проект.

#mbp2015 #xcode7 #ios9

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

основная проблема для всех этих решений заключается в том, что это серьезно снижает переносимость вашей библиотеки.

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

мой выбор был, наконец, просто использовать фреймворки-всегда-как рекомендовано Apple (WWDC видео).

Так легче и делает ту же работу в конце !

еще одно довольно элегантное решение, которое, кажется, работает, чтобы использовать частные Cocoapods. Cocoapods делает всю работу конфигурации, копию заголовка и так далее.

основы рок !

вот что решил такую же проблему для меня.

У меня есть цель приложения и цель расширения iMessage. Тогда у меня было 2 SDK (мои собственные), на которые ссылается приложение Target.

проблема была в том, что моя цель iMessage также использовала 2 SDK из моих (отдельные проекты), но она не связывалась с ними на этапах сборки - > Link Binary с библиотеками. Мне пришлось добавить мои 2 SDK в цель iMessage там, чтобы соответствовать моей цели приложения, и теперь это архивный.

Обновление: Xcode 9

приведенные выше ответы не работали для меня с помощью Xcode 9, но это ответ прекрасно работал для меня. Я добавил $(OBJROOT)/UninstalledProducts/$(PLATFORM_NAME)/include к моему "пути поиска заголовка" и Xcode связали заголовок моей статической библиотеки без проблем.

избавьте себя от проблем и сделайте это = создайте новую учетную запись пользователя на своем Mac-откройте проект под новой учетной записью пользователя-все проблемы исчезнут. Экономьте свое время и сохраняйте здравомыслие. все эти тупые ответы не помогают!!

Удачи