2011-04-13 62 views
2

我有一些编译和运行的c代码,可以从许多不同的unix计算机(各种linux和mac,偶尔是其他计算机)访问的目录中,而不同的操作系统显然需要不同的可执行文件。如何判断是否为当前机器编译了可执行文件?

我有一个简单的shell脚本调用相应的可执行文件prog.$OSTYPE.$MACHTYPE,如果需要的话,先编译它。这非常简单(尽管它需要使用csh才能确定$OSTYPE$MACHTYPE的可靠定义),并且它几乎可行。

然而,事实证明,甚至$OSTYPE$MACHTYPE是不够的:例如,编译在OSX 10.5产生一个可执行prog.darwin.i386其中,在OSX 10.4当被调用时,立即崩溃。

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

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

回答

2

你可以使用gcc -v找出安装/运行的GCC认为是主持编译(在bash像$(gcc -v 2>&1 | grep Target: | sed 's/.*: *//')

编辑目标弓

如果你真的想在没有特别安装的情况下做到这一点,你可以从gcc中提取config.guess脚本(它位于任何gc的顶级目录中c源码包)并运行它。不幸的是,这不适用于所有系统,可能与系统gcc软件包用于某些发行版的内容不完全一致,但这是用于配置gcc以用于构建的脚本,除非您明确地覆盖该脚本...

+0

如果gcc不存在,'bash --version'同样会告诉你编译的目标bash是什么(并且bash通常在所有系统上存在并正确编译)。 (这可能与gcc的目标不同) – Matt 2011-04-18 01:18:19

+0

这给出了我想要的信息,但如果它不依赖于gcc,它会更好(尽管这些天可能一切都有gcc)。即使在没有编译器的机器上(不要大笑,它是Mac上的可选安装),对于我的脚本来说,看到另一台具有相同体系结构的计算机已经生成了可执行文件(现在可以使用)这是你在这种情况下所能达到的最好结果 - 每次都比重新编译更强大)。 – Matt 2011-04-18 01:34:55

2

尝试使用file命令从shell提示符

+0

这非常适合查看编译的系统可执行文件。 – Matt 2011-04-18 01:19:51

+0

但它并不能说明目前的系统是什么。即使在/ bin中查询可执行文件也没有帮助,因为它们很胖(然后“文件”列出了多种体系结构,并且您必须猜测它们是什么)。 – Matt 2011-04-18 01:27:55

0

下载一些打开使用C语言编写的源代码包,并查看文件./configure,该文件基本上是一个大型的shell脚本,通常通过编译和运行短C程序来收集来自多个源的信息。这会告诉你你需要知道的一切。

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

相关问题