在OS X上编译C程序以在Linux上运行

4
我有一个相当简单的C程序,使用标准库函数进行一些加密计算。
我将在Ubuntu上运行该程序(10.04,32位),并使用cc编译该程序,编译时使用-m32标志。当我尝试在Ubuntu上运行它时,出现错误消息“无法执行二进制文件”。
但是,在Ubuntu上编译后,它可以正常运行。
是否有简便的方法将OS X上的代码编译成可在Ubuntu上运行的二进制文件?如果没有,是什么原因导致二进制文件不兼容?

部分重复:https://dev59.com/gFXTa4cB1Zd3GeqPxwu1 这也链接到crosstool-NG - user244343
2个回答

4
您需要设置一个交叉编译器。使用GNU工具链,该过程大致如下:
  1. 下载binutilsgccglibc
  2. 解压bintuls(到类似于binutils-x.y.z的文件夹)。
  3. mkdir binutils-linux
  4. cd binutils-linux
  5. ../binutils-x.y.z/configure --target=i386-ubuntu-linux(目标不确定)
  6. make
  7. sudo make install
  8. cd ..
  9. 解压gcc(到类似于gcc-x.y.z的文件夹)。
  10. mkdir gcc-linux
  11. cd gcc-linux
  12. ../gcc-x.y.z/configure --target=i386-ubuntu-linux(目标不确定)
  13. make
  14. sudo make install
  15. cd ..
  16. 解压glibc(到类似于glibc-x.y.z的文件夹)
  17. mkdir glibc-linux
  18. cd glibc-linx
  19. ../glibc-x.y.z/configure --target=i386-ubuntu-linux(目标不确定)
  20. make
  21. sudo make install
  22. cd ..
我从未尝试过OSX作为主机操作系统,因此我不知道是否存在其他复杂性,但这是一般的方法。我是凭记忆工作的,因此如果您需要更多帮助,请添加评论。

感谢提供的信息。我想在VirtualBox中安装一份Ubuntu副本来进行编译。这似乎是最简单的方法。 - TWA
你还需要与目标发行版相近的Linux内核头文件。GLIBC没有这些头文件就无法与内核进行交互。 - Adam Hawes
请注意,编译gcc可能需要几分钟时间...并且获取binutils和glibc的正确配置选项可能需要一些调查。 - RBerteig
一个虚拟机看起来确实是走捷径的方法。但想一想,如果你选择一条困难的路,你可以获得所有极客信用点! - RBerteig
2
@RBerteig - 哈哈,说得对。十五年前我可能会追求极客信仰。现在我只想把事情做好 :) - TWA

1

很抱歉,由于 GCC 的最小可移植性,您无法这样做。

当然,您可以构建 类似于这样 的交叉编译器,但我建议您使用并在 Ubuntu 虚拟机中编译。


可以的!我之前就成功地做到了这一点。GCC 高度可移植。不可移植的是支持结构(库和内核接口)。构建交叉编译器并不是特别容易,而且对于初学者来说有很多难点需要克服。考虑到如今虚拟机的普及,只需使用一个虚拟机更加方便和安全。 - Adam Hawes

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