Руководство программиста в Photon (953920), страница 27
Текст из файла (страница 27)
Для получения более полной информации см. описание appbuilder в "Справочнике утилит QNX".
Запуск команды make
Как только Вы выбрали тип библиотеки, Вы готовы компилировать и линковать. Когда Вы впервые генерируете Ваше приложение, PhAB создаёт файл Makefile в директории src (плюс по файлу Makefile для каждой платформы, выбранной при мультиплатформенной разработке), так что Вы можете собирать Ваше приложение. Последующие генерации кода непосредственно не модифицируют файл – вместо этого они обновляют внешние файлы, на которые ссылается Makefile. После того как Makefile сгенерирован, Вы вольны его модифицировать, при нескольких условиях:
-
PhAB размещает в Makefile ссылки на внешние файлы для объектных файлов, файлов с исходным кодом и хеадер-файлов, как сгенерированных им, так и созданных пользователем. Не удаляйте эти ссылки.
-
PhAB также использует три ссылки на целевые имена, называющиеся app, shr и proto. Не переименовывайте эти целевые объекты.
Целевые объекты app и shr используются для компилирования и линковки приложения со статическими или совместно используемыми библиотеками. Целевой объект proto используется для генерирования файла прототипа приложения proto.h; см. раздел "Генерирование прототипов функций" ниже в этой главе.
По умолчанию файл Makefile совместим с инсталлированной командой "make". Вы можете преобразовать файл в формат, соответствующий предпочитаемой Вами команде "make" – просто убедитесь, что метод ссылки на внешние файлы ещё совместим.
Для получения более полной информации см. раздел "Включение неPhAAB-шных файлов в Ваше приложение" ниже в этой главе.
Чтобы собрать Ваше приложение:
-
Щёлкните на кнопке "Make", чтобы открыть диалог "Make Application", и запустите на исполнение make.
-
Если во время исполнения make будут обнаружены какие-либо ошибки или предупреждения, PhAB сделает доступными кнопки "Edit" и "Restart".
Чтобы редактировать первый файл, содержащий ошибки, щёлкните на "Edit". После решения проблем щёлкните на "Restart", чтобы запустить make снова. Чтобы остановить в любой момент make, щёлкните на "Abort".
-
После того как приложение откомпилировано и слинковано, PhAB делает доступной кнопку "Done" диалога "Make". Щёлкните на "Done", чтобы закрыть диалог. Кнопка "Done" становится также доступной, если щёлкнуть на "Abort".
Модифицирование команды make
По умолчанию PhAB использует установленную make-команду, чтобы собрать Ваше приложение. Если Вам необходимо каким-либо образом изменить эту команду, щёлкните на кнопке "Build Preferences".
Все изменения, сделанные Вами в установках "Build Preferences", сохраняются не как глобальные установки, а вместе с самим приложением.
Запуск приложения на исполнение
Как только Ваше приложение без ошибок откомпилировано и слинковано, оно готово к исполнению. Просто следуйте этим шагам:
-
Если Вы использовали PhAB для создания многоязыкового приложения, Вы можете перед запуском Вашего приложения на исполнение выбрать язык в диалоге "Build+Run". Для получения более полной информации см. главу "Поддержка международных языков".
-
Если Ваше приложение требует аргументы командной строки, введите их в поле "Run Arguments".
-
Щёлкните на кнопке "Run Appl".
Когда Ваше приложение исполняется, его рабочей директорией является та, что отображена в диалоге "Build+Run".
Если Вы используете в Вашем приложении такие функции как printf(), то если Вы запустили приложение из PhAB, вывод идёт на Вашу консоль. Чтобы увидеть этот вывод:
-
Откройте окно pterm и используйте утилиту ditto для просмотра консоли (ditto описана в "Справочнике утилит QNX")
или
-
Откройте pterm и запустите приложение не из PhAB, а из pterm.
PhAB остаётся активным, пока исполняется Ваше приложение. Чтобы между ними переключаться, используйте панель задач Window Manager'а.
Отладка
PhAB позволяет Вам запускать Ваше приложение под отладчиком, который может оказаться полезным, если Ваше приложение терпит крах или ведёт себя неверно.
Чтобы запустить Ваше приложение из отладчика, щёлкните на кнопке "Debug Application". Этот отладчик запускается в терминальном окне. Ваше приложение отображается при запуске его из отладчика.
Чтобы переключиться между отладчиком и приложением, используйте панель задач Window Manager'а.
Модифицирование команды отладчика
Принимаемым по умолчанию отладчиком является gdb. Если Вам необходимо каким-либо образом изменить эту команду, щёлкните на кнопке "Advanced Options" и отредактируйте команду отладчика. Если Вы используете вызовы printf() для отладки Вашей программы, простейший способ увидеть вывод – это изменить принимаемый по умолчанию отладчик на:
pterm -z
Когда Вы щёлкаете на кнопке "Debug Application" в диалоге "Build+Run", PhAB создаёт pterm, запускающий Ваше приложение. Вывод программы появляется в окне pterm. Опция -z оставляет окно pterm открытым вплоть до явного закрытия. Для получения более полной информации по pterm см. "Справочник утилит QNX6". Вы можете даже использовать printf() и gdb вместе, установив принимаемый по умолчанию отладчик в:
pterm gdb
Когда Вы щёлкните на кнопке "Debug Application" в диалоге "Build+Run", PhAB запускает pterm, который запускает gdb, запускающий Ваше приложение. Вы можете затем использовать gdb и видеть печатаемый программой вывод.
Все изменения, сделанные Вами в установках "Build Preferences", сохраняются не как глобальные установки, а вместе с самим приложением.
Включение в Ваше приложение не-PhAB файлов
Ваше приложение может включать файлы, которые были созданы не в PhAB, но Вам необходимо сообщить PhAB'у, как их отыскать.
Мультиплатформенные приложения
PhAB генерирует пустой список следующих файлов в директории src, и Вы можете его редактировать:
indHfiles | Не PhAB-шные хеадер-файлы. Например: MYHDR=../header1.h ../header2.h |
indOfiles | Не PhAB-шные файлы объектных модулей. Например: MYOBJ=file1.o file2.o |
indSfiles | Не PhAB-шные файлы исходного кода. Например: MYSRC=../file1.c ../file2.c |
Помните о необходимости задания файловых имён относительно местонахождения файлов Makefile. Для мультиплатформенного приложения они являются относительными к директории платформы:
-
хеадер-файлы и файлы исходного кода обычно располагаются в родительской директории src, так что их имя начинается с ../
-
объектные модули обычно располагаются в той же директории, что и файлы Makefile
Одноплатформенные приложения
Одноплатформенные приложения из более ранних версий Photon не имеют файлов indHfiles, indOfiles и indSfiles. Вместо этого Вы находите MYHDR, MYOBJ и MYSRC в Вашем файле Makefile и можете там задавать имена файлов.
Помните о необходимости задания файловых имён относительно местонахождения файла Makefile. Для одноплатформенного приложения они являются относительными к директории src.
Добавление библиотек
Если Ваше приложение использует библиотеку, которая по умолчанию не включена в Makefile, Вы можете её добавить, отредактировав следующие переменные:
-
LDFLAGS – используется при линковке вместо статических библиотек Photon'а.
-
SDFLAGS – используется при линковке вместо библиотек совместного доступа Photon'а.
Создание результирующей DLL как приложения PhAB
Вы можете создать приложение PhAB как DLL, однако не существует опции PhAB, позволяющей Вам это сделать. PhAB ничего не знает о создании DLLей; существует библиотека PhAB, позволяющая Вам преобразовать приложение PhAB в DLL.
Приложение, загружающее Вашу DLL, должно быть приложением PhAB, так что, по существу, библиотека PhAB инициализирована.
Даже несмотря на то, что PhAB позволяет Вам при старте устанавливать функцию инициализации и окна открытия, они игнорируются, когда Ваше приложение является DLL. Это происходит потому, что обычно запуск выполняется путём вызова функции main(), а в DLL функция main() не вызывается. Не пытайтесь также вызывать её из своего собственного кода.
Компилирование и линковка
Вообще Вы можете преобразовать любое приложение (как создание PhAB'ом, так и нет) в DLL, добавив -shared к флагам компилятора и линковщика (и вероятнее всего добавляя расширение so или dll к имени файла). Вам необходимо также установить для линкера опцию -Bsymbolic, чтобы быть уверенным, что локально определённые символы, используемые DLL, не будут переписаны другими символами с такими же именами из исполняемого файла.
Чтобы выполнить эти изменения для приложения PhAB, следует сделать в Makefile следующее:
-
Добавить -shared к CFLAGS
-
Добавить -shared -Wl, -Bsymbolic к LDFLAGS и SDFLAGS.
-
Найти все случаи появления исполниемого имени и добавить к нему расширение so или dll.
Инициализация DLL
Обычно DLL определяет функцию инициализации, которую вызывает приложение после того, как оно вызвало функцию dlopen() для загрузки DLL. Функция инициализации Вашей DLL требует полный путь к DLL.
Перед вызовом какого-либо кода PhAB функция инициализации должна вызвать ApAddContext() подобным образом:
ApAddContext(&AbContext, fullpath);
Аргументами здесь являются:
AbContext – | глобальная структура данных, которую PhAB перемещает в abmain.c |
| Эта структура имеет одно и то же имя во всех приложениях PhAB или DLL, так что Вы должны линковать Вашу DLL с опцией -Bsymbolic, как упомянуто выше. |
fullpath – | полный путь к DLL, подходящий для передачи в функцию open(). |
Вы можете вызвать функцию ApAddContext() более одного раза, но Вы должны отслеживать, как много раз Вы её вызывали.
ApAddContext() возвращает 0 в случае успешного выполнения или –1 при неудаче. Не выполняйте вызов какой бы то ни было функции Ap*, если вызов функции ApAddContext() завершился неудачей.
Выгрузка Вашей DLL
Когда приложение готово выгрузить DLL, оно обычно вызывает в DLL функцию очистки. В функции очистки Вашей DLL Вы должны:
-
Закрыть все базы данных виджетов, открывавшиеся Вашей DLL
-
Уничтожить все виджеты PhAB, принадлежащие Вашей DLL
-
Если Ваша DLL определила классы виджетов, вызвав функцию ApAddClass(), удалить их, вызвав функцию ApRemoveClass()
-
Вызвать функцию ApRemoveContext() подобным образом:
ApRemoveContext(&AbContext);
Вы должны вызвать ApRemoveContext() столько раз, сколько раз Вы успешно вызывали ApAddContext(). После того как Вы вызвали ApRemoveContext(), Ваша DLL не должна вызывать какие-либо функции PhAB.
Глава 9. Работа с программным кодом
PhAB делает простым создание пользовательского интерфейса с приложением. Как только PhAB сгенерировал заготовки программного кода для Вашего приложения, Вам необходимо написать ту часть, которая делает приложение что-то выполняющим. Эта глава описывает, как работать с программным кодом для приложения PhAB.
Она включает следующие разделы:
-
Переменные и декларации
-
Глобальный хеадер-файл
-
Имена функций и файлов
-
Функция инициализации
-
Установочные функции модулей
-
Функции ответных реакций кодового типа
-
Типы данных о геометрии
-
Таймеры
-
Меню инициализации
-
Задержка обновления и принудительное обновление экрана
Для получения информации об использовании в программе Photon нитей см. раздел "Параллельные операции".
Переменные и декларации
Переменные и декларации виджетов
PhAB создаёт глобальные переменные и декларации для каждого созданного Вами модуля, и каждого виджета, имеющего уникальное имя экземпляра. Это делает простым доступ к виджетам из Вашего программного кода приложения.
Глобальная переменная представляет имя виджета и определена в файле abvars.h. Каждая глобальная переменная принимает такую форму:
-
ABN_widget_name – где widget_name является именем виджета или именем экземпляра модуля, который Вы определили в панелях управления ресурсами или ответными реакциями. Значение этой переменной является уникальным в пределах всего приложения.
Декларация представляет указатель на экземпляр виджета и определена а файле abdefine.h. Этот файл, который включается во все файлы с кодом на языке С Вашего приложения, также определяет внешнюю ссылку на глобальные переменные. Каждая декларация принимает такую форму:
-
ABW_widget_name – где widget_name является именем виджета или именем экземпляра модуля, который Вы определили в панелях управления ресурсами или ответными реакциями.
PhAB не создаёт декларации ABW_... для модулей меню или пунктов меню. Обычно меню не живут достаточно долго, так что декларации для них не очень-то полезны. Если Вам необходимо изменять ресурсы PtMenu, создайте установочную функцию для модуля меню и делайте работу там. См. раздел "Установочные функции модулей" ниже.
Когда PhAB обнаруживает уникальное имя экземпляра, он генерирует имя глобальной переменной и декларацию виджета. Например, если Вы изменили имя экземпляра виджета класса PtButton – на "done", PhAB сгенерирует следующее:
-
ABN_done
-
ABW_done
Глобальная переменная и декларация виджета будут иметь силу только после того как виджет будет создан, и до тех пор, пока не будет уничтожен.
Использование глобальной переменной и декларация виджета
Давайте теперь посмотрим несколько примеров того, как Вы можете использовать глобальное имя и декларацию виджета из программного кода приложения. Во-первых, вот пример использования глобальной переменной ABN_done и функции ApName() для проверки конкретного виджета в ответной реакции:
int mycallback(PtWidget_t * widget, ...) {