C 如何判断当前机器是否编译了可执行文件?
我在一个目录中编译并运行了一些c代码,这个目录可以从许多不同的unix计算机(各种linux和mac,偶尔还有其他计算机)访问,不同的操作系统显然需要不同的可执行文件 我有一个简单的shell脚本,它调用适当的可执行文件,C 如何判断当前机器是否编译了可执行文件?,c,shell,gcc,compiler-construction,portability,C,Shell,Gcc,Compiler Construction,Portability,我在一个目录中编译并运行了一些c代码,这个目录可以从许多不同的unix计算机(各种linux和mac,偶尔还有其他计算机)访问,不同的操作系统显然需要不同的可执行文件 我有一个简单的shell脚本,它调用适当的可执行文件,prog.$OSTYPE.$MACHTYPE,必要时先编译它。这非常简单(尽管它需要使用csh才能可靠地定义$OSTYPE和$MACHTYPE),而且几乎可以正常工作 然而,事实证明,即使是$OSTYPE和$MACHTYPE都是不够的:例如,在OSX 10.5上编译会产生一个可
prog.$OSTYPE.$MACHTYPE
,必要时先编译它。这非常简单(尽管它需要使用csh
才能可靠地定义$OSTYPE
和$MACHTYPE
),而且几乎可以正常工作
然而,事实证明,即使是$OSTYPE
和$MACHTYPE
都是不够的:例如,在OSX 10.5上编译会产生一个可执行的prog.darwin.i386
,当在OSX 10.4上调用时,它会立即崩溃
是的,每次我想运行程序时重新编译都是解决这个问题的一种方法,但这似乎太过分了。我知道在每台机器上都有一个bin
目录是一个标准的解决方案,但是非root用户在其主目录之外可能没有太多的写访问权限(这在所有机器上都很常见)
所以我的问题是,有没有更好的方法?编译器(通常是gcc)显然知道它是为什么样的系统编译的——是否有一种好的可移植方法来找出我的脚本运行在什么样的“系统”上,这样它就可以调用正确的可执行文件,不要使用行为未定义的工具?尝试从shell提示符使用
file
命令您可以使用gcc-v
来确定已安装/可运行的gcc认为托管编译的目标是什么(类似于bash中的$(gcc-v2>&1 | grep target:| sed's/*:*/')
)
编辑
如果您确实希望能够在不安装任何特定内容的情况下执行此操作,则可以从gcc(它位于任何gcc源程序包的顶级目录中)提取
config.guess
脚本并运行该脚本。不幸的是,这不适用于所有系统,并且可能与系统gcc包用于某些发行版的内容不完全匹配,但这是用于配置gcc以进行构建的脚本,除非您显式重写它…下载一些用C编写的开源软件包,并查看文件。/configure基本上是一个大型shell脚本,通常通过编译和运行短C程序从多个源收集信息。这会告诉你你需要知道的一切
由于您正在处理最新的Mac OS X,请确保选择当前正在维护并支持OS X版本的软件包。如果不存在gcc,
bash--version
同样会告诉您编译目标bash的目的(bash通常存在并在所有系统上正确编译)。(这可能不同于gcc的目标。)这正好提供了我想要的信息,但如果它不依赖于gcc,那就更好了(尽管现在可能所有东西都有gcc)。即使在一台根本没有编译器的机器上(别笑,这是Mac上的可选安装),如果我的脚本看到另一台具有相同体系结构的机器已经生成了一个现在可以使用的可执行文件,那就太好了(在这种情况下,这是你所希望的最好的了——也比每次重新编译都更健壮)。这非常有助于查看编译系统可执行文件的目的。但它没有指示当前系统是什么。即使在/bin中查询可执行文件,如果它们是胖的,也没有帮助(然后“文件”列出了多个体系结构,您必须猜测您的体系结构是什么)。