如何判断是否为当前机器编译了可执行文件?

时间:2011-04-13 22:06:28

标签: c shell gcc compiler-construction portability

我有一些编译和运行的c代码,可以从许多不同的unix计算机(各种linux和mac,偶尔会有其他人)访问,而不同的操作系统显然需要不同的可执行文件。

我有一个简单的shell脚本,可以调用相应的可执行文件prog.$OSTYPE.$MACHTYPE,必要时首先编译它。这非常简单(虽然它需要使用csh才能可靠地定义$OSTYPE$MACHTYPE)并且它几乎可以正常工作。

然而,事实证明即使$OSTYPE$MACHTYPE也是不够的:例如,在OSX 10.5上编译会产生一个可执行文件prog.darwin.i386,当在OS​​X 10.4上调用时,它会立即崩溃

是的,每次我想运行程序时重新编译都是解决这个问题的一种方法,但似乎过分了。我知道在每台机器上都有一个bin目录是一个标准的解决方案,但是非root用户可能在其主目录之外没有太多的写访问权限(这对所有机器都是通用的)。

所以我的问题是,有更好的方法吗?编译器(通常是gcc)显然知道它正在编译什么类型的系统 - 是否有一种很好的可移植方式来查找我的脚本运行的“类型系统”,因此它可以调用正确的可执行文件,而不是一个未定义的行为?

3 个答案:

答案 0 :(得分:2)

尝试使用shell提示符中的file命令

答案 1 :(得分:2)

您可以使用gcc -v来确定已安装/可运行的gcc认为哪些是托管编译的目标arch(类似于bash中的$(gcc -v 2>&1 | grep Target: | sed 's/.*: *//')

修改

如果您真的希望能够在没有安装任何特定内容的情况下执行此操作,则可以从gcc(在任何gcc源程序包的顶级目录中)中提取config.guess脚本并运行该脚本。不幸的是,这不适用于所有系统,可能与系统gcc包用于某些发行版的内容完全匹配,但这是用于配置gcc进行构建的脚本,除非您明确覆盖它...

答案 2 :(得分:0)

下载一些用C编写的开源软件包,并查看文件./configure,它基本上是一个大型shell脚本,通过编译和运行短C程序来收集来自多个来源的信息。这将告诉您需要了解的所有信息。

由于您正在处理最近的Mac OS X,请确保选择当前正在维护的软件包并支持OS X版本。