【问题标题】:How to tell whether an executable was compiled for the present machine?如何判断是否为当前机器编译了可执行文件?
【发布时间】:2011-04-13 22:06:28
【问题描述】:

我有一些我编译和运行的 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)显然知道它正在为什么样的系统编译——有没有一种很好的可移植方法来找出我的脚本正在运行的“什么样的系统”,所以它可以调用正确的可执行文件,而不是一个有未定义的行为?

【问题讨论】:

    标签: c shell gcc compiler-construction portability


    【解决方案1】:

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

    编辑

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

    【讨论】:

    • 如果 gcc 不存在,bash --version 同样会告诉您编译目标 bash 的目的(并且 bash 通常存在并在所有系统上正确编译)。 (这可能与 gcc 的目标不同。)
    • 这给出了我想要的信息,但如果它不依赖于 gcc 会更好(尽管这些天也许一切都有 gcc)。即使在根本没有编译器的机器上(别笑,它是 Mac 上的可选安装),我的脚本很高兴看到另一台相同架构的机器已经生成了现在可以使用的可执行文件(在这种情况下,这是您所希望的最好结果——也比每次都重新编译更强大)。
    【解决方案2】:

    尝试在 shell 提示符下使用file 命令

    【讨论】:

    • 这对于查看编译的系统可执行文件非常有用。
    • 但它并不表示当前系统是什么。如果它们很胖,即使在 /bin 中查询可执行文件也无济于事(然后“文件”列出了多个架构,您必须猜测您的架构是什么)。
    【解决方案3】:

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

    由于您使用的是最新的 Mac OS X,因此请确保选择当前正在维护并支持 OS X 版本的软件包。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 2011-03-09
      • 1970-01-01
      • 2011-09-13
      • 1970-01-01
      • 2021-08-09
      相关资源
      最近更新 更多