lee*_*777 18
我怀疑你会找到一个仅用于编译C代码的解决方案.即使你发现了一个编译C代码的sbt插件,如果它做得很好,我会感到非常惊讶.与编译Scala相比,编译本机库太不一样了.
为了编译C或C++库,我建议使用CMake或Automake.两者都不是完美的,但两者都很好地允许你基本上声明"将这些.c或.cpp文件编译成.so".Automake在开源项目中更受欢迎,但CMake相当简单.如果这是一个要求,CMake也对Windows上的编译提供了很好的支持.
要从Scala访问本机库,我建议使用JNA.它允许您从任何JVM语言(包括Scala)访问本机代码.它没有胶带层或JNI所需的代码生成.
我已经将JNA示例从Java 移植到Scala.有几点需要注意.
puts代替printf示例和代码:
import com.sun.jna.{Library, Native, Platform}
trait CLibrary extends Library {
def puts(s: String)
}
object CLibrary {
def Instance = Native.loadLibrary(
if (Platform.isWindows) "msvcrt" else "c",
classOf[CLibrary]).asInstanceOf[CLibrary]
}
object HelloWorld {
def main(args: Array[String]) {
CLibrary.Instance.puts("Hello, World");
for ((arg, i) <- args.zipWithIndex) {
CLibrary.Instance.puts(
"Argument %d: %s".format(i.asInstanceOf[AnyRef], arg))
}
}
}
Run Code Online (Sandbox Code Playgroud)
顺便说一下,你特别提到不想要Scala to C编译器,这很有趣.最近发表了一篇关于将Scala编译为LLVM的论文,它与Scala到C编译器的效果大致相同.
Mad*_*doc 13
Scala和C是根本不同的编程语言.您不能指望从Scala到C的自动转换器.
如果要从C代码调用Scala代码,反之亦然,则应使用Java Native Interface(JNI).在这种情况下,您将有一个正在运行的JVM来执行您的Scala代码,并且JVM会将您的C代码作为动态本机库加载,并允许它通过JNI与您的Java/Scala代码进行交互.但这并不容易或直截了当; 你必须阅读并尝试很多.
| 归档时间: |
|
| 查看次数: |
8813 次 |
| 最近记录: |