TL;DR
Я получаю следующую ошибку для локальной зависимости пакета Swift при попытке использовать его в проекте iOS в Xcode:
The package product 'DlibWrapper' cannot be used as a dependency of this target because it uses unsafe build flags.
(Я использую небезопасные флаги, чтобы указать расположение статической библиотеки)
Я также попытался импортировать пакет как зависимость на основе удаленной ветки, но все равно это не удалось.
Согласно этому сообщению на форумах Swift проблема была решена некоторое время назад, и соответствующий запрос на перенос уже был объединен.
Проблема возникает как в Swift 5.2.4 (Xcode 11.6), так и в 5.3 (Xcode 12 beta 3).
Любые подсказки, в чем может быть проблема?
Подробности
Я пытаюсь создать пакет Swift, содержащий библиотеку dlib, и использовать его в приложении для iOS. Из-за платформы я не могу использовать цель .systemLibrary
для связывания dlib
. Поэтому я предварительно скомпилировал его в статическую библиотеку и упаковал вместе с кодом оболочки следующим образом:
DlibWrapper/
Libraries/
dlib/
include/
...
lib/
arm64/
libdlib.a
Sources/
CWrapper/
include/
module.modulemap
cwrapper.h
cwrapper.cpp
SwiftWrapper/
SwiftWrapper.swift
Package.swift
Упрощенное содержание DlibWrapper/Package.swift
:
// swift-tools-version:5.3
import PackageDescription
let package = Package(
name: "DlibWrapper",
platforms: [
.iOS(.v13)
],
products: [
.library(
name: "DlibWrapper",
targets: ["CWrapper", "SwiftWrapper"])
],
dependencies: [],
targets: [
.target(
name: "SwiftWrapper",
dependencies: ["CWrapper"]
),
.target(
name: "CWrapper",
cxxSettings: [.headerSearchPath("../../Libraries/dlib/include")],
linkerSettings: [
.linkedLibrary("dlib"),
.linkedFramework("Accelerate", .when(platforms: [.iOS])),
// The error is caused by this line
.unsafeFlags(["-LLibraries/dlib/lib/arm64"], .when(platforms: [.iOS])),
]
),
],
cxxLanguageStandard: .cxx1z
)
Я пытался использовать свойство link
внутри module.modulemap
, но компилятор, похоже, его игнорирует. Кроме того, указание абсолютного пути к библиотеке в .linkedLibrary()
в целевом манифесте не помогает, компоновщик жалуется, что не может найти библиотеку.
Есть идеи обходных путей? (В крайнем случае я бы, наверное, все упаковал в фреймворк)
Был бы признателен за любую помощь.
Спасибо