2012-04-28 3 views
3

Я пишу программу C с POSIX API и использую Linux. Я скомпилировал и запустил его на Mac OSX для Mac друга, и произошла небольшая ошибка, но я не использовал конкретные функции Linux.Как проверить совместимость POSIX?

Я буду использовать некоторые специфические функции, которые Linux добавляет к API. Я также буду использовать специальные расширения POSIX для Mac OS X и FreeBSD.
Я буду использовать условную компиляцию, чтобы выбрать код. Если ОС не является таковой, я буду использовать общий код POSIX.

Я не являюсь владельцем Darwin/Mac OSX и FreeBSD, Linux - единственная ОС, которую я имею на своем ПК. Я не могу загрузить и установить FreeBSD, потому что это более 500 МБ.
Я хочу знать, как проверить, будет ли программа компилироваться и вести себя так, как ожидалось, в других системах POSIX.
Интересно, есть ли симулятор POSIX и компилятор для проведения тестов.
Тесты просты, они не используют графический интерфейс и драйверы, они являются только командной строкой.

Мне нужно будет сделать 3 теста: FreeBSD, Mac OSX/Darwin и Generic POSIX, но у меня нет инструментов.

EDIT

Есть ли минимальная версия FreeBSD и Darwin без графического интерфейса, но с GCC/G ++ и SSH/УПП? Дарвин свободен, не так ли?
Мой компьютер устарел, но я думаю, что смогу установить их на виртуальной машине, создать виртуальную сеть и использовать ssh/scp для передачи и тестирования программ.

+6

Это что-то вроде клише, но «нет портативного кода; только код, который был портирован ». Не существует замены для тестирования систем. В противном случае вам нужно закодировать подмножество стандарта, на котором вы можете положиться на разные системы. Лучше всего избегать условной компиляции; это усложняет жизнь, если вам нужно ее использовать. –

+1

@ Джонатан: Хотя это правда в какой-то степени, это стало намного меньше, поэтому за последние 5-10 лет до такой степени, что многие традиционные вещи, которые люди делали ради «переносимости», к «странным системам», теперь кажутся как устаревший рывок. Я согласен, что есть аргументы, которые должны быть сделаны с обеих сторон, но я думаю, что кодирование стандартов и приставочных разработчиков для исправления их сломанных реализаций, когда они не соответствуют стандартам, имеет много достоинств как способ продвижения вперед в будущее, где нам не нужно играть в игру «port to every target». –

+2

У этого также есть намного больше успеха, когда большие игроки получают на борту. С другой стороны, перехват GCC на множестве UB (например, нарушение переполнения и псевдонимов) сначала нарушил ситуацию, но прошел долгий путь, чтобы заставить программистов исправить свои сломанные программы. Некоторые аналогичные смелые действия со стороны приложения приложениями с большим именем могут иметь большие последствия. Кстати, использование этого подхода не обязательно означает, что ваша программа не будет работать на популярных сломанных платформах. Это просто означает, что вам нужно предоставить слой fix/glue, чтобы запустить ваш целевой код. –

ответ

5

Один простой способ заключается в том, чтобы скомпилировать вашу программу с помощью соответствующих макросов проверки функций. Например, если вы определяете _POSIX_C_SOURCE целевой версии POSIX (в настоящее время 200809L), вы запрашиваете, чтобы заголовки системы отображали в вашу программу ничего, кроме того, что необходимо/разрешено базой POSIX. Это можно сделать с помощью командной строки CFLAGS с -D_POSIX_C_SOURCE=200809L. Если вы хотите вариант XSI (полная функциональность Single Unix Standard, которая является надмножеством базы POSIX), вместо этого используйте вместо этого -D_XOPEN_SOURCE=700.

Это не поможет вам обнаружить проблемы, возникающие из определенных систем, не имеющих функциональности POSIX (например, OSX поврежден и не работает рабочий sem_init, последний раз, когда я проверял, даже если он является обязательным в POSIX), или от написания кода, который зависит по нестандартному поведению в интерфейсах стандарта POSIX (например, с использованием расширений регулярных выражений GNU в выражениях, которые вы передаете regcomp), но это поможет вам избежать случайного использования интерфейсов не в стандарте.

+0

Что касается OS X - http://stackoverflow.com/questions/1413785/sem-init-on-os-x. Компилирует, но возвращает ошибку для неназванных семафоров. – dsolimano

+0

Спасибо за ссылку. Это очень неудачно, так как (неназванные) семафоры являются одним из наиболее полезных инструментов синхронизации, предлагаемых POSIX (особенно их способностью использоваться из обработчиков сигналов), тогда как семафоры довольно неуклюжи, загрязняют глобальное пространство имен и могут отставать, если вы неожиданно прекратите ... –

1

Если вы хотите скомпилировать другую систему, вам, как правило, не нужна другая система, вам просто нужно соответствующее cross compiler.

Смежные вопросы