【问题标题】:How to build SML/NJ executable on Mac如何在 Mac 上构建 SML/NJ 可执行文件
【发布时间】:2012-01-04 12:26:02
【问题描述】:

我有一个可以作为堆映像运行的 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 shell 脚本,关键行(变量扩展)执行以下操作:

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 生成正确的架构?

【问题讨论】:

    标签: macos smlnj


    【解决方案1】:

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

    我知道您具体询问的是 SML/NJ,但 MLton 支持 64 位,并且使此类任务变得非常容易。如果您能够使用它来生成可执行的二进制文件,您稍后可能会感谢自己。

    【讨论】:

    • 不幸的是,CFLAGS 被 SML/NJ heap2exec 脚本忽略。
    猜你喜欢
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 2016-12-27
    • 2013-01-07
    • 2015-06-17
    相关资源
    最近更新 更多