Я хотел бы использовать диспетчер пакетов Swift для включения статической библиотеки C в мою сборку. документация Apple показывает процесс с разделяемыми библиотеками, но я надеюсь, что есть способ использовать статический. Я могу связываться со статическими библиотеками, используя swiftc
, поэтому кажется разумным надеяться, что я смогу сделать это, используя swift build
.
У меня есть небольшой пример проблемы, в которой используется статическая библиотека C, содержащая функцию для умножения двух чисел. (Примечание: я использую Swift 3 Preview 1 в Linux)
Структура каталогов выглядит так:
example/
Package.swift
main.swift
.git/
CMult/
Package.swift
module.modulemap
mult.h
libmult.a
.git/
Содержание example / Package.swift:
import PackageDescription
let package = Package(
name: "example",
dependencies: [
.Package(url: "../CMult", majorVersion: 1)
]
)
Содержание example / main.swift:
import CMult
let n: Int32 = mult2(3, 5) // "int mult2(int,int)" is in mult.h and libmult.a
print("Result = \(n)")
Содержимое CMult / Package.swift:
import PackageDescription
let package = Package(
name: "CMult"
)
Содержимое CMult / module.modulemap:
module CMult [system] {
header "./mult.h"
link "mult"
export *
}
Теперь проблема в том, что когда я запускаю example$ swift build
, компоновщик жалуется на ошибку «/ usr / bin / ld: cannot find -lmult», что неудивительно, поскольку его там нет, и я не сказал ему, где еще искать . Я бы хотел каким-то образом указать флаг -L на карте модуля, указав, где искать файл .a (именно так я связал свой .a с swiftc
). Менее желательным, но приемлемым решением, казалось, было установить переменную среды LD_LIBRARY_PATH для просмотра в CMult /, но это не изменило ошибку.
Любые идеи? Спасибо.