我想使用Scala Native编写程序,但它必须在一个带有非常旧的glibc的Linux主机(CentOS 6.5)上运行。因此,我想将该程序部署为静态链接可执行文件,例如Go语言所做的那样。
如何使用Scala Native构建静态链接可执行文件?是否可能?如果可以,如何操作?如果不行,为什么?
如何使用Scala Native构建静态链接可执行文件?是否可能?如果可以,如何操作?如果不行,为什么?
sbt选项nativeLinkingOptions
接受一个Seq[String]
的额外参数,这些参数会原封不动地传递给clang进行链接。
在项目构建设置中添加以下内容对我进行了快速测试:
nativeLinkingOptions += "-static"
我不是这个主题的专家,但从我的理解来看,并非所有类型的应用程序都可以做到这一点,甚至可能基于您的依赖库而言是不可能的;
例如,您无法静态链接到glibc
(它不是设计为可静态链接的,并且具有像nss这样的动态功能,防止其被静态链接)。
您可以尝试另一个libc实现,如musl
,它是可静态链接的,但是您需要从头开始编译很多东西,最终,您的输出二进制文件可能会出现一些奇怪的行为,例如名称解析可能无法工作,除非您也使用了解析器库。
那是一个你可能不想去的兔子洞!
但是,如果您也是经验丰富的C/C++开发人员,您可以像其他答案中提到的那样调整链接器参数;但是您可能需要手动链接,因为当前可用的sbt选项不允许您更改现有链接参数的顺序,这在静态链接时非常重要!