मुझे संदेह है कि आपको सी कोड संकलित करने के लिए एक एसबीटी-केवल समाधान मिलेगा। यहां तक कि यदि आपको एक एसबीटी प्लगइन मिला है जो सी कोड संकलित करता है, तो भी यह वास्तव में हैरान होगा अगर यह ठीक से हुआ। स्केल संकलन की तुलना में मूल पुस्तकालयों को संकलित करना बहुत अलग है।
अपनी सी या सी ++ लाइब्रेरी को संकलित करने के लिए, मैं CMake या Automake की अनुशंसा करता हूं। न तो सही है, लेकिन दोनों मूल रूप से घोषित करने की अनुमति देने का एक अच्छा काम करते हैं "इन .c या .cpp फ़ाइलों को एक .so में संकलित करें"। ओपन सोर्स प्रोजेक्ट्स के साथ ऑटोमैक अधिक लोकप्रिय है, लेकिन सीएमके काफी सरल है। विंडोज़ पर संकलन के लिए सीएमके के पास भी अच्छा समर्थन है, अगर यह एक आवश्यकता है।
स्कैला से अपनी मूल लाइब्रेरी तक पहुंचने के लिए, मैं JNA का उपयोग करने की सलाह देता हूं। यह आपको स्कैला समेत किसी भी जेवीएम भाषा से मूल कोड तक पहुंचने की अनुमति देता है। और यह JNI द्वारा आवश्यक गोंद परत या कोड जनरेशन के बिना ऐसा करता है।
मैंने जावा से स्कैला तक the JNA example पोर्ट किया है। ध्यान देने के लिए कुछ चीजें हैं।
- जावा varargs स्कैला varargs से अलग हैं। यदि आप एक वैरिएडिक सी फ़ंक्शन को कॉल करना चाहते हैं, तो आपको स्कैला के बजाय जावा में इंटरफ़ेस लिखना होगा। लेकिन आप उस इंटरफेस का उपयोग उसी तरह करेंगे जैसे आप स्केल में लिखे गए थे।
- मैं उदाहरण चाहता था स्काला में सख्ती से रहने के लिए, तो मैं उदाहरण
- मैं काफी एक सीधे बंदरगाह किया में
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))
}
}
}
एक के रूप में अलग रूप में, यह है कि आप विशेष रूप से सी संकलक करने के लिए एक स्काला नहीं चाहते उल्लेख मज़ेदार है। स्केल से एलएमवीएम को संकलित करने के बारे में प्रकाशित recent paper था, जो स्केल टू सी कंपाइलर के रूप में काफी हद तक प्रभावशाली होगा।
तो आप स्कैला से सी या सी कोड से स्कैला कोड कॉल करना चाहते हैं? –
जहां तक मेरा संबंध है, मुझे लगता है कि मैंने आपके प्रश्न का उत्तर दिया है। दो अन्य लोगों ने भी किया, लेकिन आपने इनमें से किसी को जवाब देने के लिए चिह्नित नहीं किया। वह अजीब है। – Madoc