Настройка Framework в приложениях командной строки macOS — Причина: изображение не найдено

Я боролся с этим уже несколько недель. Почему следующая установка macOS выдает ошибку компоновщика Alamofire?

Шаги для воссоздания ошибки компоновщика:

  • Создайте новое приложение командной строки macOS
  • Запустите pod init из Terminal Update
  • Создайте следующий подфайл:

    платформа: osx, «10.10», цель «testMacOS», используйте_frameworks! pod 'Alamofire', '~> 4.0' конец

Выполнить pod install. Открыть и построить рабочее пространство

Ошибка: dyld: библиотека не загружена: @rpath/Alamofire.framework/Versions/A/Alamofire Причина: изображение не найдено

НА ДАННЫЙ МОМЕНТ эта ошибка имела смысл. Вам нужно было перейти в Target's/General/Linked Frameworks and Libraries. Затем добавьте Аламофайр. Теперь Alamofire находился внутри каталога Framework рабочей области.

Стройте и запускайте. Та же ошибка. Почему?


person rustyMagnet    schedule 21.11.2016    source источник


Ответы (3)


Инструменты командной строки действительно «поддерживают» фреймворки, но не так, как это делают пакеты приложений. Вам нужно поместить упомянутые фреймворки в @rpath, что на практике равно ~/Library/Frameworks/ или /Library/Frameworks/.

person Joe Daniels    schedule 08.12.2016

Вам нужно установить @rpath вручную, Pod установить фреймворки в "$(ProductDirectory)/$(FrameworkName)/$(FrameworkName).framework".

Например, ваша платформа Alamofire находится по адресу "$(ProductDirectory)/Alamofire/Alamofire.framework". Поэтому вам нужно добавить "@executable_path/Alamofire/" в Настройки сборки — пути поиска путей вашей цели.

Кроме того, «Проект Pods — Alamofire (Target)» также необходимо указать позицию динамической библиотеки быстрого выполнения. В моей среде мне нужно добавить «/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx» в «Настройки сборки — Пути поиска Runpath».

Но для удобства вы можете посмотреть мой код post_install.

post_install do |installer|
    files = Dir.glob("*.xcodeproj")
    proj_file = files[0]
    app_project = Xcodeproj::Project.open(proj_file)

    app_project.native_targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings['LD_RUNPATH_SEARCH_PATHS'] = '$(inherited) @executable_path/../Frameworks @loader_path/Frameworks'
            prefix = ' @executable_path/'

            # For each pod, add the framework path to LD_RUNPATH_SEARCH_PATHS
            installer.pods_project.targets.each do |pod_target|
                config.build_settings['LD_RUNPATH_SEARCH_PATHS'] = config.build_settings['LD_RUNPATH_SEARCH_PATHS'] + prefix + pod_target.name + '/'

                pod_target.build_configurations.each do |pod_config|
#if you want embed swift stdlib into every framework, uncommend 1,2 and commend 3,4
#1
#pod_config.build_settings['ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES'] = 'YES'
#2
#pod_config.build_settings['LD_RUNPATH_SEARCH_PATHS'] = '$(inherited) @executable_path/../Frameworks @loader_path/Frameworks'

#3
pod_config.build_settings['ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES'] = 'NO'
#4
pod_config.build_settings['LD_RUNPATH_SEARCH_PATHS'] = '$(inherited) /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx/'
                end
            end
        end
    end

    app_project.save
end
person Chaorders    schedule 03.05.2017
comment
Спасибо, просто спас мой день! - person melbic; 05.09.2019

ПРОБЛЕМА: с Xcode 8.1 я не осознавал, что приложения командной строки macOS не поддерживают фреймворки (динамические библиотеки) так же, как приложения iOS или настольные macOS делают это с пакетом.

РЕШЕНИЕ: я обошел эту проблему, взяв исходный код с github и скомпилировав его в своем рабочем пространстве. Это сработало. Импорт статической библиотеки также сработал.

person rustyMagnet    schedule 06.12.2016