2016-08-10 3 views
-1

У меня есть исходный код, который предназначен для компиляции в Windows и Linux с использованием gcc. Он отлично работает даже под cygwin. Теперь, когда я пытаюсь скомпилировать для iOSMacro posix_c_source

echo $OSTYPE 
darwin14 

все кажется прекрасным, и сборка успешно получена. Однако, когда я попытался запустить приложение CUI, появится сообщение Ошибка сегментации 11.

После нескольких дней поиска в Интернете, случайно я нашел это link.

В результате, я сделал следующее изменение в одном из * .c файл

-#define _POSIX_C_SOURCE 199309 
+#define _POSIX_C_SOURCE 199506 

и новой сборки отлично работает. Хотя я не программист, мне интересно, что было бы столь значительным в разных этих макросах? Не могли бы вы прокомментировать, почему такое изменение становится настолько значительным.

+3

Когда вы получаете сбой, такой как ошибка сегментации, ваше первое действие должно не переопределять специальные макросы. Вместо этого нужно * отлаживать * приложение, найти местоположение и причину сбоя. Просто потому, что он * кажется * работает, не гарантируется, что основная проблема на самом деле исправлена. У вас может быть неопределенное поведение в коде, и авария (или другое непредвиденное поведение) может вернуться, когда вы меньше всего этого ожидаете. –

+2

Является ли ваш код многопоточным? Это могло бы объяснить это, потому что '199506' ввел потоки (и без этого ваша библиотека C не может включать конструкторы безопасности потока). В противном случае это трудно сказать, не глядя на какой-либо код. –

+0

@Joachim: Thx для вашего предложения. Я знаю, что мой подход не профессионал. К сожалению, мои навыки отладки практически не существуют. – AjanO

ответ

1

хотя это всего лишь 1 строка кода, но это может иметь большое значение, POSIX является стандартом, он определяет интерфейс между ОС и приложениями и имеет много разных версий (вы можете думать, что это похоже на аппаратный USB-интерфейс стандартный, он имеет много версий, таких как USB 1.0 и USB 2.0).

Иногда программист не может определить, на какой платформе будет работать программа, он может работать на Linux, может работать на окнах, может быть, система предоставляет старый стандартный интерфейс, возможно, новый.

Таким образом, программист добавить этот вид макросов, писать коды для многих различных интерфейса, например, исходный код, как это:

#define WIN 
#ifdef WIN 
    <part 1:1000 lines of code> 
#endif 
#ifdef LINUX 
    <part 2:1000 lines of code> 
#endif 
    <1000 lines that not depend on system , can both run on Linux and Windows.> 

компилятор компилирует часть 1 (отбрасывать часть 2), но когда вы меняете #define WIN до #define LINUX, он будет содержать часть 2 (и отказаться от части 1)! вы можете подумать, что вы изменили только 1 строку, но компилятор может выбрать или отбросить тысячи строк (может быть, даже больше, а может быть и меньше, которые зависят от кода).

+0

Получил ваш момент! Спасибо. – AjanO