【问题标题】: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 容器中运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-05
      • 1970-01-01
      • 2012-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多