我有一些编译和运行的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)显然知道它正在编译什么类型的系统 - 是否有一种很好的可移植方式来查找我的脚本运行的“类型系统”,因此它可以调用正确的可执行文件,而不是一个未定义的行为?
答案 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版本。