チュートリアルの「C バインディング」を読みましたが、C の初心者です。
Crystal プログラムをリンク先のスタティック ライブラリとしてビルドできるかどうかを誰かに教えてもらえますか?もしそうなら、簡単な例を教えてください。
チュートリアルの「C バインディング」を読みましたが、C の初心者です。
Crystal プログラムをリンク先のスタティック ライブラリとしてビルドできるかどうかを誰かに教えてもらえますか?もしそうなら、簡単な例を教えてください。
はい。ただし、お勧めしません。Crystal は GC に依存しているため、共有 (または静的) ライブラリを作成することは望ましくありません。したがって、そのようなものの作成を支援する構文レベルの構成要素も、そうするための単純なコンパイラ呼び出しもありません。ドキュメントの C バインディング セクションでは、C で記述されたライブラリを Crystal プログラムで使用できるようにすることについて説明しています。
とにかく簡単な例を次に示します。
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!");
}
で共有ライブラリを作成できます
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
関数が含まれていることを確認しましょう
nm liblogger.so | grep crystal_
nm liblogger.a | grep crystal_
よし、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
または静的バージョン
# 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
https://gist.github.com/3bd3aadd71db206e828fから多くのインスピレーションを得て