我已经使用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容器中运行。