有没有办法在.swift文件中声明一个函数(编译成.swiftmodule),如下所示:
hello.swift
func hello_world() {
println("hello world")
}
main.swift
import hello
hello.hello_world()
我也做了a git repo with these two files and a Makefile with the compile / link commands ready to go。目前我可以让main.swift导入hello,但它目前无法链接...是否有另一个链接器标志我可以通过?目前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
答案 0 :(得分:12)
.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
如果没有文件,我不能说这是完全正确的,但它确实有效。
请注意,如果您只是想在应用程序模块中使用多个源文件,那么这更简单,并且在main.swift中不需要import
声明或模块限定:
swift -o main hello.swift main.swift
答案 1 :(得分:1)
目前你还不必在swift中导入文件。因为所有文件对程序都是公共的,所以可以使用简单的let helloSwift = hello
调用方法。您正在定义一个名为helloSwift的常量,它用作全局hello。当然,你不能在没有类或结构的情况下声明这个,但这是另一个教训。只需知道您使用let
而不是导入。
答案 2 :(得分:1)
要使用swift build在Linux中生成.so文件,您可以创建一个名为eg的shell脚本文件。构建,其内容为:
#!/bin/bash
swift build -Xswiftc -emit-library -Xswiftc -o -Xswiftc libhello.so