如何生成没有依赖项的Crystal可执行文件?

我正在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" . 但是,我没有进行与ssl相关的调用,因为我只使用它连接到不安全的网站 .

我显然也依赖于 libevent-2.0.so.5 . 据推测,所有Crystal程序都可以 . 谁知道Crystal有多少其他依赖?

我的可执行文件必须在新安装的Linux系统上运行 . 那么,如何生成没有依赖项的Crystal可执行文件?我认为除了libc之外 .

回答(1)

3 years ago

在Linux中,您可以使用 ldd 命令列出可执行文件所需的共享库 . 在OSX中, otool -L 可用于相同目的 .

通常,链接器将在构建可执行文件时使用共享库(如果可以找到它们) . 因此,您需要做的是强制链接器使用静态库 . (将来我们可能会在编译器中添加一个标志来强制执行此选择)

您应该在/ opt / crystal / embedded / lib中找到一些静态库 . 我们使用它们来生成可移植的Crystal编译器 .

要使用这些库,您可以运行:

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

在考虑安装在标准位置的其他库之前,应该更喜欢该目录中可用的库 .

遗憾的是,OpenSSL不随Crystal一起发布,因此您必须复制或构建静态版本的 libssllibcrypto . 无论如何,这是一个通用的库,可以在任何Linux发行版中使用 .

关于 libc ,这更棘手 . 我们使用旧的CentOS和Debian发行版为版本编译Crystal二进制文件,以使其与更多libc版本兼容 .