crystal-lang - play - nim lang
¿Se puede vincular estáticamente una biblioteca de Crystal desde C? (1)
Sí, pero no se recomienda hacerlo. Crystal depende de un GC, lo que hace que sea menos deseable producir bibliotecas compartidas (o estáticas). Por lo tanto, tampoco hay construcciones de nivel de sintaxis para ayudar en la creación de tal, ni una simple invocación del compilador para hacerlo. La sección de enlaces de C de la documentación trata sobre cómo hacer que las bibliotecas escritas en C estén disponibles para los programas de Crystal.
Aquí hay un ejemplo simple de todos modos:
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
C Principal
#include "logger.h"
int main(void) {
crystal_init();
crystal_log("Hello world!");
}
Podemos crear una biblioteca compartida con
crystal build --single-module --link-flags="-shared" -o liblogger.so
O una biblioteca estática 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
Confirmemos que nuestras funciones fueron incluidas.
nm liblogger.so | grep crystal_
nm liblogger.a | grep crystal_
Muy bien, es hora de compilar nuestro programa de C
# 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 versión estática
# 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 mucha inspiración de https://gist.github.com/3bd3aadd71db206e828f
He leído los "enlaces de C" en el tutorial, pero soy un principiante en cosas de C.
¿Podría alguien, por favor, avisarme si un programa de Crystal puede construirse como una biblioteca estática para vincular, y si es así, podría dar un ejemplo simple?