Как определить, скомпилирован ли исполняемый файл для данной машины? - PullRequest
2 голосов
/ 14 апреля 2011

У меня есть некоторый код на c, который я компилирую и запускаю в каталоге, доступном с разных компьютеров Unix (разных Linux и Mac, иногда других), причем разным ОС, очевидно, нужны разные исполняемые файлы.

У меня есть простой сценарий оболочки, который вызывает соответствующий исполняемый файл prog.$OSTYPE.$MACHTYPE, сначала компилируя его при необходимости. Это очень просто (хотя для надежного определения $OSTYPE и $MACHTYPE необходимо использовать csh), и оно почти работает.

Однако оказывается, что даже $OSTYPE и $MACHTYPE недостаточно: например, компиляция в OSX 10.5 дает исполняемый файл prog.darwin.i386, который при вызове в OSX 10.4 мгновенно завершает работу.

Да, перекомпиляция каждый раз, когда я хочу запустить программу, является одним из способов решения этой проблемы, но это кажется чрезмерным. Я знаю, что наличие каталога bin на каждой машине является стандартным решением, но пользователь без полномочий root может не иметь большого доступа для записи за пределами своего домашнего каталога (что является общим для всех машин).

Итак, мой вопрос: есть ли лучший подход? Компилятор (часто gcc), очевидно, знает, для какой системы он компилируется - есть ли хороший переносной способ узнать, на какой «системе» работает мой сценарий, чтобы он мог вызвать правильный исполняемый файл вместо одного? с неопределенным поведением?

Ответы [ 3 ]

2 голосов
/ 14 апреля 2011

Вы можете использовать gcc -v, чтобы выяснить, что установленный / запускаемый gcc считает целевой аркой для компиляции на хосте (что-то вроде $(gcc -v 2>&1 | grep Target: | sed 's/.*: *//') в bash)

редактировать

Если вы действительно хотите сделать это без установки чего-либо конкретного, вы можете извлечь сценарий config.guess из gcc (он находится в каталоге верхнего уровня любого исходного пакета gcc) и запустить его. К сожалению, это не сработает для всех систем и может не совсем соответствовать тому, что системный пакет gcc использует для некоторых дистрибутивов, но этот сценарий используется для настройки gcc для сборки, если вы явно не переопределите его ...

2 голосов
/ 14 апреля 2011

попробуйте использовать file команду из командной строки

0 голосов
/ 14 апреля 2011

Загрузите некоторые пакеты с открытым исходным кодом, написанные на C, и посмотрите на файл ./configure, который представляет собой большой сценарий оболочки, который собирает информацию из многих источников, часто путем компиляции и запуска коротких программ на C. Это расскажет вам все, что вам нужно знать.

Поскольку вы имеете дело с новейшей Mac OS X, убедитесь, что вы выбрали пакет, который в настоящее время поддерживается и поддерживает версии OS X.

...