2015-10-02 4 views
17

मैंने ट्यूटोरियल में "सी बाइंडिंग" के माध्यम से पढ़ा है लेकिन मैं सी सामान में नौसिखिया हूं।क्या क्रिस्टल लाइब्रेरी को सी से स्थिर रूप से जोड़ा जा सकता है?

क्या कोई मुझे कृपया बता सकता है कि क्रिस्टल प्रोग्राम को एक स्थिर पुस्तकालय के रूप में बनाया जा सकता है, और यदि ऐसा है तो कृपया आप एक साधारण उदाहरण प्रदान कर सकते हैं?

उत्तर

22

हां, लेकिन ऐसा करने की अनुशंसा नहीं की जाती है। क्रिस्टल एक जीसी पर निर्भर करता है जो साझा (या स्थैतिक) पुस्तकालयों का उत्पादन करने के लिए कम वांछनीय बनाता है। इस प्रकार ऐसा करने के लिए एक सरल संकलक आमंत्रण के निर्माण में सहायता के लिए कोई वाक्यविन्यास स्तर संरचना भी नहीं है। प्रलेखन में सी बाइंडिंग अनुभाग क्रिस्टल कार्यक्रमों के लिए उपलब्ध सी में लिखे गए पुस्तकालय बनाने के बारे में है।

यहाँ किसी भी तरह एक सरल उदाहरण है:

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

+0

धन्यवाद स्थिर संस्करण

# 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.a lib gcc main.c -o static_main -Llib -levent -ldl -lpcl -lpcre -lgc -llogger ./static_main 

बहुत प्रेरणा के साथ! यह एक कार्यक्रम में एक और अभी तक बड़ी उपयोगिता के लिए है जिसे केवल एक बार बुलाया जाता है, इसलिए न्यूनतम बातचीत होती है। इसे वास्तव में * गो * प्रोग्राम से बुलाया जाता है और उपयोगिता * निम * से पोर्ट की जा रही है। यदि यह हिस्सा काम करता है, तो मैं संभवतः * गो * प्रोग्राम * क्रिस्टल * पर बंदरगाह होगा लेकिन यह इस दौरान काम करेगा। एक बार फिर धन्यवाद! –

+0

आपके पास उस लाइय में शामिल सभी नई नस्ल प्रणालियों प्रोग्रामिंग भाषाएं हैं, आपको केवल कुछ जंग की जरूरत है और आपको पूरा संग्रह लॉल मिल गया है। वैसे भी @ जोन हास, उत्कृष्ट सारांश। – Shayne

+0

@ जोन हास: '-N' ध्वज 'स्ट्रिप' को ओएसएक्स पर गलत है (शायद क्योंकि बीएसडी।) क्या आप जानते हैं कि ओएसएक्स समतुल्य क्या है? – andrewdotnich

संबंधित मुद्दे

 संबंधित मुद्दे