2015-10-02 13 views

risposta

22

Sì, ma non è consigliabile farlo. Crystal dipende da un GC che rende meno desiderabile la produzione di librerie condivise (o statiche). Quindi non ci sono costrutti di livello di sintassi per aiutare nella creazione di tale, né una semplice invocazione del compilatore a farlo. La sezione C binding nella documentazione riguarda il rendere le librerie scritte in C disponibili per i programmi Crystal.

Ecco un semplice esempio tant'è:

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.ce

#include "logger.h" 

int main(void) { 
    crystal_init(); 
    crystal_log("Hello world!"); 
} 

possiamo creare una libreria condivisa con

crystal build --single-module --link-flags="-shared" -o liblogger.so 

o una libreria statica con

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 

Diamo confermare le nostre funzioni ma ho incluso

nm liblogger.so | grep crystal_ 
nm liblogger.a | grep crystal_ 

Va bene, il tempo per compilare il nostro C programma

# 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 

O la versione statica

# 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 

Con molta ispirazione da https://gist.github.com/3bd3aadd71db206e828f

+0

Grazie mille! Questo è per una singola utility ancora più grande in un programma che viene chiamato solo una volta, quindi c'è interazione minima. In realtà è chiamato da un programma * Go * e l'utilità viene portata da * Nim *. Se questa parte funzionasse, probabilmente porterei il programma * Go * su * Crystal * ma questo funzionerà nel frattempo. Grazie ancora! –

+0

Hai tutti i linguaggi di programmazione dei sistemi di nuova generazione coperti da Lye, tutto ciò di cui hai bisogno è un po 'di ruggine e hai tutta la collezione lol. In ogni caso @Jonne Haß, eccellente sintesi. – Shayne

+0

@Jonne Haß: il flag '-N' su' strip' non è corretto su OSX (probabilmente perché BSD.) Sai qual è l'equivalente OSX? – andrewdotnich

Problemi correlati