【问题标题】:How to dynamically link your nim-application against musl?如何将您的 nin 应用程序与 musk 动态链接?
【发布时间】:2022-08-18 02:48:44
【问题描述】:
我使用 prologue 框架在 nim 中编写了一个网络服务器。我想使用 alpine-docker-container 部署该应用程序。
据我所知,编译意味着您可以根据需要动态链接系统库,任何普通发行版上的系统库都是glibc。
但是在 alpine 上,您不使用glibc,而是使用musl,因此动态链接glibc 意味着我的应用程序将期望具有glibc 名称的glibc 函数不存在,因为只有musl 函数。
对于我作为一个跳入 nim 并且对编译器知之甚少的 python 开发人员来说,由此产生的一个大问题是:
如何编译,以便动态链接musl?
标签:
compilation
dynamic-linking
nim-lang
musl
【解决方案1】:
来自 nim discord 的人给我带来了答案。它包括将标志传递给 nim 编译器以换出 nim 通常用于其生成的 C 代码的编译器,以便使用 musl-gcc。这可以通过使用--gcc.exe:"musl-gcc" 和--gcc.linkerexe:"musl-gcc" 标志来完成。
这是 Linux 的示例:
1.安装musl以访问musl-gcc
-
download官方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 容器中运行。