如何在Mac上构建SML/NJ可执行文件

4

我有一个可以作为堆图像运行的SML/NJ程序,我想创建一个独立的可执行二进制文件。然而,SML/NJ 110.73中的heap2exec工具总是给我返回错误。

我通过以下方式创建了我的堆图像tigerc.x86-darwin:

ml-build sources.cm Main.main tigerc

我可以通过堆镜像正常运行我的程序,使用以下方法:

sml @SMLload=tigerc.x86-darwin 

我应该能够通过以下方式创建独立的二进制文件:

heap2exec tigerc.x86-darwin tigerc

但是那会生成错误

ld: warning: -macosx_version_min not specificed, assuming 10.7
ld: warning: ignoring file tigerc.o, file was built for unsupported file format 
which is not the architecture being linked (i386)

我看了一下heap2exec脚本,其中关键行(变量扩展后)执行以下操作:

heap2asm "$heapfile" "$execfile".s
cc -c -o "$execfile".o "$execfile".s
ld -o "$execfile" ${RUNX} "$execfile".o

当我单独运行这些步骤时,cc 命令会生成一个 x86_64 的 .o 文件,但是 ld 命令却试图链接一个 i386 可执行文件。因此,我需要让 cc 命令也生成一个 i386 的 .o 文件。
有没有一种设置环境变量的方法,使得 cc 构建 i386 而不是 x86_84?(顺便说一句,ARCH 并不能解决问题,它已经设置为 i386。)
或者,是否有其他解决方法可以让 heap2exec 生成正确的架构?
1个回答

0

尝试将CFLAGS=-m32添加为环境变量。这是强制构建32位目标文件的标准方法。

我知道你特别问的是SML/NJ,但是MLton支持64位,并且使这种任务变得非常容易。如果您有机会使用它生成可执行二进制文件,您可能会感激自己。


很遗憾,SML/NJ heap2exec脚本忽略了CFLAGS。 - Jay Lieske

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接