如何将你的nim应用程序与musl动态链接



我已经使用prolog框架在nim中编写了一个web服务器。我想使用AlpineDocker容器来部署该应用程序。据我所知,编译意味着你可以动态地链接到你的系统库,以满足你的任何需求,任何普通发行版上的系统库都是glibc。然而,在alpine上,您不使用glibc,而是使用musl,因此针对glibc动态链接意味着我的应用程序将期望具有glibc名称的glibc函数,但这些函数并不存在,因为只有musl函数。

作为一名python开发人员,我跳上了nim,对编译器知之甚少,由此产生的一个大问题是:如何编译,以便根据musl动态链接?

来自nim discord的人让我找到了答案。它包括将标志传递给nim编译器,以交换nim通常用于其生成的C代码的编译器,从而使用musl-gcc。这可以通过使用--gcc.exe:"musl-gcc"--gcc.linkerexe:"musl-gcc"标志来完成。

这里有一个Linux的例子:

1。安装musl以访问musl gcc
  • 从musl官方页面下载tar文件
  • 将tar文件解压缩到某个位置
  • 在解压缩的目录中运行bash-configure。警告:请确保不要在--prefix/usr/local的情况下安装musl,因为这可能会对您的系统产生不利影响。在其他不太可能覆盖文件的地方使用,例如/usr/local/musl。此路径将进一步称为<MUSL_INSTALL_PATH>
  • 在解压缩的目录中运行make && make install
  • <MUSL_INSTALL_PATH>添加到PATH环境变量中
  • 通过打开一个新终端并查看您是否可以访问musl-gcc命令来验证您是否正确设置了所有内容
2。使用musl编译
  • --gcc.exe:"musl-gcc"创建一个编译命令,用musl-gcc交换gcc,用--gcc.linkerexe:"musl-gcc"也用musl-gcc交换默认链接器。示例如下所示:
nim c 
--gcc.exe:"musl-gcc" 
--gcc.linkerexe:"musl-gcc" 
--define:release 
--threads:on 
--mm:orc 
--deepcopy:on 
--define:lto 
--outdir:"." 
<PATH_TO_YOUR_MAIN_PROJECT_FILE>.nim
  • 运行命令

这应该生成一个针对musl动态链接的二进制文件,因此可以在alpine docker容器中运行。

相关内容

  • 没有找到相关文章

最新更新