हां, लेकिन ऐसा करने की अनुशंसा नहीं की जाती है। क्रिस्टल एक जीसी पर निर्भर करता है जो साझा (या स्थैतिक) पुस्तकालयों का उत्पादन करने के लिए कम वांछनीय बनाता है। इस प्रकार ऐसा करने के लिए एक सरल संकलक आमंत्रण के निर्माण में सहायता के लिए कोई वाक्यविन्यास स्तर संरचना भी नहीं है। प्रलेखन में सी बाइंडिंग अनुभाग क्रिस्टल कार्यक्रमों के लिए उपलब्ध सी में लिखे गए पुस्तकालय बनाने के बारे में है।
यहाँ किसी भी तरह एक सरल उदाहरण है:
logger.cr
fun init = crystal_init : Void
# We need to initialize the GC
GC.init
# We need to invoke Crystal's "main" function, the one that initializes
# all constants and runs the top-level code (none in this case, but without
# constants like STDOUT and others the last line will crash).
# We pass 0 and null to argc and argv.
LibCrystalMain.__crystal_main(0, Pointer(Pointer(UInt8)).null)
end
fun log = crystal_log(text: UInt8*): Void
puts String.new(text)
end
logger.h
#ifndef _CRYSTAL_LOGGER_H
#define _CRYSTAL_LOGGER_H
void crystal_init(void);
void crystal_log(char* text);
#endif
main.c
#include "logger.h"
int main(void) {
crystal_init();
crystal_log("Hello world!");
}
हम अपने सी संकलित करने के लिए
nm liblogger.so | grep crystal_
nm liblogger.a | grep crystal_
ठीक है, समय
crystal build --single-module --link-flags="-shared" -o liblogger.so
या
crystal build logger.cr --single-module --emit obj
rm logger # we're not interested in the executable
strip -N main logger.o # Drop duplicated main from the object file
ar rcs liblogger.a logger.o
के साथ एक स्थिर पुस्तकालय के साथ एक साझा पुस्तकालय बना सकते हैं चलो हमारे कार्यों की पुष्टि करते हैं शामिल हो गया कार्यक्रम
# Folder where we can store either liblogger.so or liblogger.a but
# not both at the same time, so we can sure to use the right one
rm -rf lib
mkdir lib
cp liblogger.so lib
gcc main.c -o dynamic_main -Llib -llogger
LD_LIBRARY_PATH="lib" ./dynamic_main
या इतना से https://gist.github.com/3bd3aadd71db206e828f
स्रोत
2015-10-03 10:17:33
धन्यवाद स्थिर संस्करण
बहुत प्रेरणा के साथ! यह एक कार्यक्रम में एक और अभी तक बड़ी उपयोगिता के लिए है जिसे केवल एक बार बुलाया जाता है, इसलिए न्यूनतम बातचीत होती है। इसे वास्तव में * गो * प्रोग्राम से बुलाया जाता है और उपयोगिता * निम * से पोर्ट की जा रही है। यदि यह हिस्सा काम करता है, तो मैं संभवतः * गो * प्रोग्राम * क्रिस्टल * पर बंदरगाह होगा लेकिन यह इस दौरान काम करेगा। एक बार फिर धन्यवाद! –
आपके पास उस लाइय में शामिल सभी नई नस्ल प्रणालियों प्रोग्रामिंग भाषाएं हैं, आपको केवल कुछ जंग की जरूरत है और आपको पूरा संग्रह लॉल मिल गया है। वैसे भी @ जोन हास, उत्कृष्ट सारांश। – Shayne
@ जोन हास: '-N' ध्वज 'स्ट्रिप' को ओएसएक्स पर गलत है (शायद क्योंकि बीएसडी।) क्या आप जानते हैं कि ओएसएक्स समतुल्य क्या है? – andrewdotnich