Используйте статическую библиотеку C с менеджером пакетов Swift

Я хотел бы использовать диспетчер пакетов 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 /, но это не изменило ошибку.

Любые идеи? Спасибо.


person Philip    schedule 21.07.2016    source источник


Ответы (1)


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

example$ swift build -Xlinker -L../CMult

Вы можете найти другие полезные опции, запустив

swift build --help

Что касается LD_LIBRARY_PATH, это для поиска общих библиотек. Для статики это будет LIBRARY_PATH, но он не работал с swift build, когда я его пробовал. Однако он работает с gcc.

person Anatoli P    schedule 07.08.2016