В настоящее время я пытаюсь создать Swift Wrapper для библиотеки C.Для этого я использую менеджер пакетов Swift.
Мой план состоял в том, чтобы сначала создать system-module
, который обернет нужную C-библиотеку.После этого эта библиотека будет включена в другой пакет Swift типа Library
.Чтобы проверить все, я хотел сделать еще один пакет Swift типа executable
Проблема заключается в последней части.Исполняемый файл не находит ссылки на Library
.
Чтобы объяснить все лучше, вот мой рабочий процесс:
1) Создайте новый пакет swift с:swift package init --type system-module
.Вот окончательный файл Package.swift
:
// swift-tools-version:4.2
import PackageDescription
let package = Package(
name: "Clibmongoc",
pkgConfig: "libmongoc-1.0",
providers: [
.brew(["mongo-c-driver"])
],
products: [
.library(name: "Clibmongoc", targets: ["Clibmongoc"])
]
)
И .modulemap
:
module Clibmongoc [system] {
header "/usr/local/include/libmongoc-1.0/mongoc.h"
link "Clibmongoc"
export *
}
2) Теперь мне нужно было создать Library
:
Сначала я инициализировал его с помощью: swift package init --type Library
.В результате был получен Package.swift:
// swift-tools-version:4.2
import PackageDescription
let package = Package(
name: "SwiftLibMongoC",
products: [
// Products define the executables and libraries produced by a package, and make them visible to other packages.
.library(
name: "SwiftLibMongoC",
targets: ["SwiftLibMongoC"]),
],
dependencies: [
// Dependencies declare other packages that this package depends on.
.package(url: "../Clibmongoc", from: "1.0.2")
],
targets: [
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
// Targets can depend on other targets in this package, and on products in packages which this package depends on.
.target(
name: "SwiftLibMongoC",
dependencies: ["Clibmongoc"]),
.testTarget(
name: "SwiftLibMongoCTests",
dependencies: ["SwiftLibMongoC"]),
]
)
Поэтому я просто скопировал ранее созданный пакет в новую библиотеку.Я также убедился, что тег git system-module
установлен на 1.0.2
.Я также удостоверился, чтобы включить зависимость в цель.Как и ожидалось, при создании .xcodeproj
у меня был доступ к Clibmongoc
system-module
.
Теперь мы подошли к проблеме.
3) Я создалтестовый модуль с swift package init --type executable
и я включил только что созданный Library
в манифест:
// swift-tools-version:4.2
import PackageDescription
let package = Package(
name: "SwiftLibMongoCTest",
dependencies: [
// Dependencies declare other packages that this package depends on.
.package(url: "../SwiftLibMongoC", from: "0.0.2")
],
targets: [
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
// Targets can depend on other targets in this package, and on products in packages which this package depends on.
.target(
name: "SwiftLibMongoCTest",
dependencies: ["SwiftLibMongoC"]),
.testTarget(
name: "SwiftLibMongoCTestTests",
dependencies: ["SwiftLibMongoCTest"]),
]
)
Опять я убедился, что версия из тега git правильно установлена на 0.0.2
, а также зависимость SwiftLibMongoC
был установлен в зависимости в цели.
При попытке построить исполняемый файл он работает, однако, когда создается .xcodeproj
, я могу импортировать system-module
Clibmongoc
, но я делаюне получить auto completion
для нового Library
SwiftLibMongoC
.Но если я импортирую и создаю его, я не получаю ошибок, однако, если я пытаюсь получить доступ к сгенерированному по умолчанию коду из Library
в новом executable
, я получаю ошибку:
useнеразрешенного идентификатора
Любая помощь с благодарностью.