Как импортировать быструю функцию, объявленную в скомпилированном .swiftmodule, в другой быстрый файл?

Есть ли способ объявить функцию в файле .swift(который скомпилирован в .swiftmodule), например:

hello.swift

func hello_world() {
    println("hello world")
}

main.swift

import hello

hello.hello_world()

Я также сделал a git repo с этими двумя файлами и Makefile с готовностью к компиляции/ссылкам. В настоящее время я могу получить main.swift, чтобы импортировать привет, но в настоящее время он не связывает... есть ли еще один флаг компоновщика, который я могу пройти? В настоящее время Makefile:

PWD=$(shell pwd)
APP_NAME=main
MODULE_NAME=hello
SWIFT_MODULE_PATH=$(PWD)/$(MODULE_NAME).swiftmodule
SDK=/Applications/Xcode6-Beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk


main : clean
xcrun swift $(MODULE_NAME).swift -emit-module -v
xcrun swift $(APP_NAME).swift \
    -o $(APP_NAME) \
    -sdk $(SDK) \
    -I $(PWD) \
    -Xlinker -sectalign \
    -Xlinker __SWIFT \
    -Xlinker __ast \
    -Xlinker 4 \
    -Xlinker -sectcreate \
    -Xlinker __SWIFT \
    -Xlinker __ast \
    -Xlinker $(SWIFT_MODULE_PATH) \
    -v

Ответы

Ответ 1

.swiftmodule описывает интерфейс модуля Swift, но не содержит реализацию модуля. Для привязки вашего приложения по-прежнему требуется библиотека или набор объектных файлов. Здесь изменена версия makefile, которая создает как libhello.dylib, так и hello.swiftmodule и создает приложение против них:

PWD=$(shell pwd)
APP_NAME=main
MODULE_NAME=hello
LIB_NAME=lib$(MODULE_NAME).dylib
LIB_PATH=$(PWD)/$(LIB_NAME)
SWIFT_MODULE_PATH=$(PWD)/$(MODULE_NAME).swiftmodule

main : clean
    xcrun swift \
        -emit-library \
        -o $(LIB_PATH) \
        -Xlinker -install_name \
        -Xlinker @rpath/$(LIB_NAME) \
        -emit-module \
        -emit-module-path $(SWIFT_MODULE_PATH) \
        -module-name $(MODULE_NAME) \
        -module-link-name $(MODULE_NAME) \
        -v \
        $(MODULE_NAME).swift
    xcrun swift $(APP_NAME).swift \
        -o $(APP_NAME) \
        -I $(PWD) \
        -L $(PWD) \
        -Xlinker -rpath \
        -Xlinker @executable_path/ \
        -v


clean :
    rm -rf $(APP_NAME) $(LIB_NAME) $(MODULE_NAME).swiftmodule $(MODULE_NAME).swiftdoc

В отсутствие документации я не могу сказать, что это абсолютно правильно, но она работает.

Обратите внимание: если вы просто хотите использовать несколько исходных файлов в своем прикладном модуле, это намного проще и не требует объявления import или квалификации модуля в main.swift:

swift -o main hello.swift main.swift

Ответ 2

На данный момент вам не нужно импортировать файлы в swift. Поскольку все файлы являются общедоступными для вашей программы, вы можете вызывать методы с помощью простого let helloSwift = hello. Вы определяете константу с именем helloSwift, которая используется как глобальный привет. Конечно, вы не можете просто объявить это без класса или структуры, но это целый урок. Просто знайте, что вместо импорта вы используете let.

Ответ 3

Чтобы создать .so файл в Linux с помощью быстрой сборки, вы можете создать файл оболочки script, например, например. build и его содержимое как:

#!/bin/bash
swift build -Xswiftc -emit-library -Xswiftc -o -Xswiftc libhello.so