Как импортировать быструю функцию, объявленную в скомпилированном .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