12

Crystalでプログラムを作成しています。コンパイルして他のシステムに移動して実行する予定です。ターゲット システムは Linux の新規インストールであるため、依存関係がないことが理想的です。

残念ながら、libc の依存関係を回避することはできません。そのため、ターゲットにしたい libc の最も低いバージョンを所有するシステムで実行可能ファイルをコンパイルする必要があると思われます。前方互換性があるはずだと思います。

ただし、libssl には問題があります。Debian Wheezy のデフォルト インストールには libssl が付属していないようです。そのため、実行可能ファイルを実行すると次のエラーが発生します。

error while loading shared libraries: libssl.so.1.0.0:
cannot open shared object file: No such file or directory

私はソースにいるので、この依存関係が存在するとrequire "http/client"思います。ただし、セキュリティで保護されていない Web サイトへの接続にのみ使用するため、ssl 関連の呼び出しは行いません。

どうやら にも依存しているようlibevent-2.0.so.5です。おそらくすべての Crystal プログラムがそうです。Crystal が他にいくつの依存関係を持っているかを誰が知っていますか?

実行可能ファイルは、新しくインストールした Linux システムで実行する必要があります。では、依存関係のない Crystal 実行可能ファイルを作成するにはどうすればよいでしょうか? libc以外だと思います。

4

2 に答える 2

12

Linux では、コマンドを使用して、実行可能ファイルに必要な共有ライブラリを一覧表示できますldd。OSX ではotool -L、同じ目的で使用できます。

通常、リンカは共有ライブラリを見つけた場合、実行可能ファイルのビルド中に共有ライブラリを使用します。したがって、必要なことは、代わりに静的ライブラリを使用するようにリンカーに強制することです。(将来、この選択を強制するフラグをコンパイラに追加する可能性があります)

これらの静的ライブラリのいくつかは、/opt/crystal/embedded/lib にあります。これらを使用して、移植可能な Crystal コンパイラを生成します。

これらのライブラリを使用するには、次を実行できます。

$ LIBRARY_PATH=/opt/crystal/embedded/lib crystal build my_app.cr

標準の場所にインストールされている他のライブラリを考慮する前に、そのディレクトリで利用可能なライブラリを優先する必要があります。

libssl残念ながら、Crystal では OpenSSL が配布されていないため、静的バージョンのおよび をコピーまたはビルドする必要がありますlibcrypto。とにかく、これは一般的なライブラリであり、どの Linux ディストリビューションでも利用できます。

に関してlibcは、もっとトリッキーです。古い CentOS および Debian ディストリビューションを使用してリリース用の Crystal バイナリをコンパイルし、より多くの libc バージョンと互換性を持たせます。

于 2016-02-03T01:59:04.287 に答える