如何使用 Emscripten 将 Hello Word 从 Swift 编译为 JavaScript
Posted
技术标签:
【中文标题】如何使用 Emscripten 将 Hello Word 从 Swift 编译为 JavaScript【英文标题】:How to get Hello Word compiling from Swift to JavaScript using Emscripten 【发布时间】:2014-06-10 13:49:30 【问题描述】:鉴于最简单的 swift 文件:
println("lol")
在命令行上使用xcrun swift -i lol.swift
运行它或使用xcrun swift lol.swift -o lol
编译成可执行文件很简单,但是对于emscripten 的简单概念证明怎么样?
我以前没有使用过 emscripten,但是在 http://kripken.github.io/emscripten-site/docs/getting_started/Tutorial.html 上找到了一个使用 C++ 的 hello world 示例,并且也想编译我的 Swift 代码。
我试过了
xcrun swift lol.swift -emit-bc -o lol.bc
emcc lol.bc
但是得到
Value: %1 = call i8*, i64, i64 @_TFSS37_convertFromBuiltinUTF16StringLiteralfMSSFTBp17numberOfCodeUnitsBw_SS(i8* bitcast ([4 x i16]* @0 to i8*), i64 3)
LLVM ERROR: Unrecognized struct value
Traceback (most recent call last):
File "/Users/glen/Downloads/emsdk_portable/emscripten/1.16.0/emcc", line 1540, in <module>
shared.Building.llvm_opt(final, link_opts)
File "/Users/glen/Downloads/emsdk_portable/emscripten/1.16.0/tools/shared.py", line 1267, in llvm_opt
assert os.path.exists(target), 'Failed to run llvm optimizations: ' + output
AssertionError: Failed to run llvm optimizations:
想法?
【问题讨论】:
【参考方案1】:问题是 LLVM 在链接过程中找不到该调用中使用的类型/符号。这些符号很可能是 swift 框架特有的。如果您使用-v
选项运行emcc
,您可以获得更多调试信息。您也可以考虑提供 --llvm-opts 提示,提示在哪里可以找到该信息。
我运行xcrun swift -v test.swift
来查看实际执行的是什么命令。
Swift version 1.0 (swift-600.0.34.4.5)
Target: x86_64-apple-darwin13.2.0
/Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift -frontend -c -primary-file test.swift -enable-objc-attr-requires-objc-module -target x86_64-apple-darwin13.2.0 -module-name test -color-diagnostics -o /var/folders/69/l9w0zkqn38s1td4_gm5c__km0000gn/T/test-d800d3.o
/usr/bin/ld /var/folders/69/l9w0zkqn38s1td4_gm5c__km0000gn/T/test-d800d3.o -force_load /Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_macosx.a -lSystem -arch x86_64 -L /Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx -rpath /Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx -macosx_version_min 10.9.0 -no_objc_category_merging -o test
您可能会考虑探索如何将这些链接选项应用于 emscripten 以获得您想要的。不会有任何关于此的文档,因为我认为他们不打算像这样使用 swift。
【讨论】:
【参考方案2】:根据 this GitHub issue 您在 Emscripten 存储库中提交的信息,您尝试做的事情是不可能的:
很遗憾,无法将 .dylib 文件链接到 Emscripten。原因是 .dylibs 已经包含 x86/x64 的本机机器代码,而 Emscripten 无法“返回”并再次将其转换为 LLVM IR 形式。
-- juj(GitHub 用户),2014-06-14
【讨论】:
以上是关于如何使用 Emscripten 将 Hello Word 从 Swift 编译为 JavaScript的主要内容,如果未能解决你的问题,请参考以下文章
使用 CMake 时如何在 Emscripten 中导出 C 函数
在 mac 上使用 cython 和 emscripten 将简单的 python 程序编译为 javascript
如何使用 Emscripten 将对象从 Javascript 传递到 C++
如何使用 emscripten 将文件从 C 保存到浏览器存储