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

标签 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 在 OSX 10.4 上调用时会立即崩溃。

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

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

最佳答案

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

编辑

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

关于c - 如何判断可执行文件是否是为当前机器编译的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5656257/

相关文章:

linux - 从 bash 中的 Json 中提取值

linux - 如何跳过文件的第一行并读取剩余行作为 C 程序的输入?

c - 任何人都知道如何在C中获取USB路径的GUID和PID

c - 语法中的左递归会导致冲突

c++ - 将虚拟机作为应用程序的一部分实现的主要好处是什么?

php - Shell 命令适用于命令行,但不适用于 PHP exec

c++ - 为 C++ 程序创建一个健壮的 Makefile

c++ - 如何设置 CMAKE 静态链接(对 `dlopen' 的 undefined reference )?

c++ - boost:asio 线程池实现,用于偶尔同步的任务

c - 为什么我的编译器不想编译这段代码?