Официальный форум СВД Встраиваемые Системы
28 Март, 2024, 11:55:40 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
 
 
 Сайт СВД ВС  Начало   Помощь Поиск Войти Регистрация  
Страниц: [1] 2   Вниз
  Печать  
Автор Тема: OpenWatcom: библиотеки для QNX4  (Прочитано 15016 раз)
Олег Большаков
Легенда

Сообщений: 3140



« : 09 Март, 2010, 01:17:24 »

Дополнительные библиотеки QNX4 при работе с OpenWatcom

Библиотека owc

При активной работе с OpenWatcom, рано или поздно, разработчик сталкивается с ошибками при сборке (линковке) программы, примерно следующего вида:

Код:
Error! E2028: __I8M is an undefined reference
Error! E2028: __I8RS is an undefined reference
Error! E2028: __I8LS is an undefined reference
Error! E2028: __I8D is an undefined reference

Это функции умножения, деления и сдвига, вызов которых вставляет компилятор, в надежде на то, что они (функции) будут обнаружены при линковке в clib. Однако, в clib из QNX4 таких функций нет. Решением этой проблемы может быть сборка библиотеки с недостающими функциями. Назовём такую библиотеку owc.

Если при сборке приложений с помощью OpenWatcom, возникают указанные выше ошибки, то необходимо добавить опцию -l owc линковщику. Можно добавить функции библиотеки owc в clib от QNX4, например, так:

Код:
$ wlib -q -b -c clib3r.lib owc3r.lib

После этого не нужно будет заботиться о добавлении опции -l owc. Smiley

Изменения в библиотеке math

При работе над сборкой библиотеки xml2 для QNX4 при помощи OpenWatcom, я столкнулся с необходимостью использовать библиотеку math из OpenWatcom. Точнее мне понадобились некоторые функции из нового заголовочного файла math.h. Просто так заменить библиотеку math не получится, т.к. некоторые функции типа _FtoS, __Nan_Inf и т.д. отсутствуют в новой библиотеке. К счастью, эти функции есть в исходном коде OpenWatcom, так что решением проблемы может быть включение указанных функций в новую библиотеку.

Сборка библиотек

Для сборки библиотек на базе OpenWatcom 1.8.0 был подготовлен Makefile. Всё что нужно, это скачать файл, изменить значения переменных WATCOM_SRC и WATCOM_BIN, которые должны указывать соответственно на каталоги с исходным кодом и собранным OpenWatcom. После этого набираем make и получаем две библиотеки: owc3r.lib и math387r.lib. Копируем эти библиотеки туда, где их может найти утилита cc для OpenWatcom (math387r.lib поверх старой), копируем math.h из каталога h бинарной версии OpenWatcom поверх старого math.h из QNX4. Теперь можно попробовать что-нибудь собрать. Wink

Замечания и дополнения приветствуются. Скачать Makefile для сборки библиотек могут только зарегистрированные пользователи.



« Последнее редактирование: 22 Январь, 2021, 12:36:59 от Александр Грибанов » Записан
Пономаренко Андрей
Интересующийся

Сообщений: 7


« Ответ #1 : 24 Октябрь, 2010, 16:32:36 »

Здравствуйте!
Попытался собрать библиотеки - не получилось.
В Вашем Makefile указано CC = wacc. wacc -это что? Ни где не нашел его.
Не совсем понятно из описания в какой ОС производить сборку.
Нельзя ли провести небольшой ликбез?
И нельзя ли поподробнее о том как можно собрать библиотеку OWC (OWC.cpp + Makefile) ?
Я пробовал создавать подобную библиотеку, однако при линковке функции все-равно не находятся. Может я что то не так делаю.
Заранее спасибо.
« Последнее редактирование: 24 Октябрь, 2010, 16:39:44 от Пономаренко Андрей » Записан
Олег Большаков
Легенда

Сообщений: 3140



« Ответ #2 : 25 Октябрь, 2010, 22:14:07 »

Постараюсь ответить на Ваши вопросы. Утилита wacc это немного доработанная утилита cc (или cc.bat для Windows) из архива ow_q4_linux_20081229.tar.gz (или ow_q4_win_20081224.zip). Добавил ссылку на скачивание в первое сообщение. Я собирал библиотеки в Linux. Думаю, что не должно быть проблем при сборке в Windows, только надо подправить пути. Более подробно о настройке OpenWatcom.

Для сборки библиотек owc3r.lib и math387r.lib требуются только исходники самого OpenWatcom (я использовал версию 1.8). надо скорректировать пути к исходным кодам в Makefile . Других тонкостей тут нет.

Если у Вас будут какие-то ошибки при кросс-компиляции OpenWatcom под QNX4, то задавайте вопросы на форуме -- постараемся ответить.
Записан
Пономаренко Андрей
Интересующийся

Сообщений: 7


« Ответ #3 : 26 Октябрь, 2010, 08:41:45 »

Здравствуйте.

Спасибо за подсказку. Библиотеки math и owc собрались, сборка тестовой задачки прошла без замечаний.
Но осталась проблема:

   float Test = 0.12345;
   cout << "Test = " << Test << "\n"; <- Отображает на экране все правильно.
   printf("Test = %f\n",Test);   <- в этом случае на экране случайные символы
   printf("Test = %5.1f\n",Test);   <- в этом случае SIGSEGV

Дело в том, что меня интересует как раз вывод величин с заранее определенным количеством знаков после запятой.

OpenWatcom подготовлен в полном соответствии с Вашим описанием.

Можете что-нибудь посоветовать? Уж очень заманчива возможность сборки приложений под Windows.
Конечно использование для этих целей связки Eclipse (в качестве редактора) и виртуальной машины тоже вполне неплохо: редактируем в Windows в Eclipse, затем по ftp копируем на вирт. машину, там же компиллируем, там же запускаем.

И еще одно: Ваш cc.bat отказывается собирать библиотеки *.lib говорит, что No compiler available for *.lib.
Пришлось вручную в Makefile указать вместо cc wlib. Правда я проделывал это только под Windows.
Записан
Михаил Колесов
Опытный пользователь

Сообщений: 125



« Ответ #4 : 26 Октябрь, 2010, 12:33:07 »

Попробуйте в вашем тесте заменить float на double.
Записан
Пономаренко Андрей
Интересующийся

Сообщений: 7


« Ответ #5 : 27 Октябрь, 2010, 06:07:17 »

Совет напомнил мне:
- Что-то машина не заводится...
- А ты фары протирал? 
Smiley
Но все-таки для надежности проверил.
Результат тот-же.
Записан
Пономаренко Андрей
Интересующийся

Сообщений: 7


« Ответ #6 : 27 Октябрь, 2010, 11:09:13 »

Подскажите пожалуйста, что я еще могу попробовать сделать?
Или, быть может, вышлите мне, если не трудно, Вашу измененную math.lib. Видимо в ней все дело.
Записан
Олег Большаков
Легенда

Сообщений: 3140



« Ответ #7 : 27 Октябрь, 2010, 11:34:24 »

Ваш пример кода у меня собирается и работает. Только я переделал его из Си++ на Си. Скажите, чем вызвано использование именно Си++? Работа OpenWatcom C++ для QNX4 тестировалась меньше всего и скорее всего могут проявляться проблемы.

Библиотеку прицепляю к этому сообщению.

И еще одно: Ваш cc.bat отказывается собирать библиотеки *.lib говорит, что No compiler available for *.lib.
Пришлось вручную в Makefile указать вместо cc wlib. Правда я проделывал это только под Windows.

Видимо, Вы используете старую версию cc.bat, которая не поддерживает ключи -A и -a. Попробуйте более новую (файл wacc), только для Windows Вам надо будет переделать заголовок файла (посмотрите как это сделано в cc.bat), у меня, к сожалению, нет Windows, чтобы переделать и проверить.
Записан
Пономаренко Андрей
Интересующийся

Сообщений: 7


« Ответ #8 : 28 Октябрь, 2010, 19:27:56 »

Спасибо за библиотеку.
Программа заработала самым неожиданным образом - убрал из Makefile принудительную прилинковку math387r. При этом math387r лежит собственной сборки.
На счет C++ - просто мне в наследство досталось огромное количество чужих программ, написанных именно таким образом: классы, наследование и прочие прелести плюсов. Так что ни чего не поделать.

Еще немного хочу поделиться опытом разработки в OpenWatcom под Windows.
Я с Вашего (или без оного) позволения слегка отредактировал файлик cc.bat:
во-первых сделал автоматическое переименование *.obj в *.o - это очень полезно поскольку зачастую в Makefile указывается "MyFile.o: ..." т.е. собирается объектный файл, который затем с чем-нибудь линкуется. Однако в Вашем файле cc.bat указано, что для Windows объектный файл имеет расширение obj. Соответственно при линковке, встретив файл с расширением *.o cc.bat выдает сообщение о невозможности что-либо предпринять с указанным файлом. Можно, конечно, в Makefile все .o переименовать в .obj и все заработает, однако при этом теряется приемственность с QNX.
Во-вторых указал, что расширением объектного файла под Windows является .o по уже описанным причинам.
В-третьих сделал автоматическое переименование готового исполняемого файла MyExeFile.qnx просто в MyExeFile. Просто крайне неудобно это *.qnx.
После проделанных изменений компиляция одного и того же проекта проходит как под Windows, так и под QNX без внесения каких-либо изменений.
Записан
Олег Большаков
Легенда

Сообщений: 3140



« Ответ #9 : 15 Ноябрь, 2010, 19:49:42 »

Внёс изменения в Makefile, ссылка в первом сообщении.
Записан
Олег Большаков
Легенда

Сообщений: 3140



« Ответ #10 : 29 Декабрь, 2014, 10:32:45 »

Немного дополнил Makefile сборки библиотеки owc. Ссылка на загрузку в первом сообщении темы.
Записан
Андрей Ивлев
Опытный пользователь

Сообщений: 138



« Ответ #11 : 29 Март, 2015, 16:11:39 »

Есть новая версия cc.bat, которая называется wacc. Опции -A и -a поддерживаются.

Обнаружил в wacc неточность, из-за которой утилита работает не так как стандартная cc.

Смотрим help утилиты cc:
Код:
# use cc
...
 -a library Add to an archive
 -A library Build new archive (using all .o`s)
...

Смотрим код утилиты wacc:
Код:
...
"A=s" => sub { $mk_lib = 1; push @L_opts, $_[1]; unshift @L_opts, "-n"; },
"a=s" => sub { $mk_lib = 2; push @L_opts, $_[1]; unshift @L_opts, "-q"; },
...
Видим что при передаче wacc опций -A или -a, wlib будут переданы опции -n или -q соответственно.

Смотрим help wlib:
Код:
# use wlib
...
| -n                       (always create a new library)
| -q                       (don't print header)
...

Из описания cледует, что при передаче wlib опции -q не выводится "какой-то" заголовок. А при вызове с опцией -n создается новая библиотека. Повызывав wlib с опцией -q и без, выясняем, что эта опция подавляет вывод сообщения(в stdout):
Код:
Open Watcom Library Manager Version 2.0 beta Mar 22 2015 23:03:45 (32-bit)
Copyright (c) 2002-2015 The Open Watcom Contributors. All Rights Reserved.
Portions Copyright (c) 1984-2002 Sybase, Inc. All Rights Reserved.
Source code is available under the Sybase Open Watcom Public License.
See http://www.openwatcom.org/ for details.

Что касается опции -n, то ее наличие или отсуствие сообщает wlib что необходимо создать новую библиотеку или же добавить .o к уже существующей. При передаче опции -A стандартной утилите cc видим:
Код:
/usr/watcom/10.6/bin/wlib -q -n -b -c tmp.lib tmp.o
А при передаче опции -a:
Код:
/usr/watcom/10.6/bin/wlib -q -b -c tmp.lib -+tmp.o

Видим что различия опции -a и -A заключаются в отсутствии или наличии опции -n утилиты wlib и добавлением "-+" к объектнику в строке. Изменив в коде утилиты wacc всего одну строку: "A=s"      => sub { $mk_lib = 1; push @L_opts, $_[1]; unshift @L_opts, "-q -n"; }, налаживаем ее работу.

P.S. Надоело выводимое утилитой wlib сообщение в stdout при передаче опции -A утилите wacc. Пришлось разобраться. Smiley
« Последнее редактирование: 30 Март, 2015, 00:09:44 от Андрей Ивлев » Записан
Олег Большаков
Легенда

Сообщений: 3140



« Ответ #12 : 30 Март, 2015, 14:07:12 »

Андрей, спасибо за столь подробное описание и решение проблемы. Внёс предложенные изменения в утилиту, обновил ссылку на скачивание.
Записан
dumb_encore
Интересующийся

Сообщений: 2


« Ответ #13 : 13 Апрель, 2015, 19:28:37 »

Добрый день.
При попытке компиляции различных программ под qnx4 (к примеру sqlite 3) сталкиваюсь со следующей ошибкой:
Цитировать
Error! E2028: __FDU87 is an undefined reference
Компиляцию выполняю с помощью ow 1.9 из-под qnx4.25, но не думаю, что это имеет значение. Собранные бинарные файлы взял с sourceforge.net.
Имя __FDU87 встретил в библиотеке clib ow 1.9 для linux.
Ошибку встречал только при компиляции файлов, содержащих операции с 64-битными числами, но отказываться от них не хотелось бы.
Существуют ли варианты решения данной проблемы?
Заранее спасибо.
Записан
Андрей Ивлев
Опытный пользователь

Сообщений: 138



« Ответ #14 : 13 Апрель, 2015, 21:36:29 »

Добрый день.
При попытке компиляции различных программ под qnx4 (к примеру sqlite 3) сталкиваюсь со следующей ошибкой:
Цитировать
Error! E2028: __FDU87 is an undefined reference
Посмотрите пост: https://groups.google.com/d/msg/openwatcom.contributors/gaBREJVRpkg/VxRNe0IMEpAJ
« Последнее редактирование: 13 Апрель, 2015, 21:54:21 от Андрей Ивлев » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP © 2002-2020 СВД Встраиваемые Системы.
При использовании материалов сайта ссылка на forum.kpda.ru обязательна.

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines | © Aiwan. Kolobok smiles | Sitemap
Valid XHTML 1.0! Valid CSS!
Сайт СВД ВС

В последний раз google посещал эту страницу 28 Март, 2024, 05:01:24