Форум » [x]Harbour » Перевожу Clipper-овский проект в Harbour » Ответить

Перевожу Clipper-овский проект в Harbour

mikeas: Добрый день, господа. Начал переводить проект с CLIPPERa(5.2Е) в Harbour и сразу же столкнулся с проблемой: undefined reference to `HB_FUN_TOKEN' ... и т.д. Пользуюсь инструкцией "Harbour - шаг за шагом" Александра Кресина, т.е. использую версию "harbour-3.0.0-win.exe". Поискал здесь на форуме похожую ситуацию. Нашел здесь: "unresolved external _HB_FUN_", но похоже не мой случай, до линковки дело еще не доходит. Куда копать? Подскажите, пожалуйста.

Ответов - 69, стр: 1 2 3 4 All

mikeas: Сори, забыл сказать, для сборки использую hbmk2.

Andrey: Попробуй это - «Перенос проекта с Clipper на xHarbour.pdf» https://cloud.mail.ru/public/2KnU/oT4KEHY8i

PSP: mikeas, TOKEN() - это функция из Clipper Tools. Попробуйте указать явно использование библиотеки hbct


mikeas: Здравствуйте, Андрей. Спасибо за оперативный ответ. DBU и прочие Клипперовские утилиты у меня собираются и работают хорошо. А как только взялся за головной модуль проекта, сразу получил проблему. Не хотелось бы переключаться на ходу HB <>xHB. Вроде определился, перехожу на Harbour. Да и проблема моя, наверняка кому-то встречалась. М.б. я какие то INCLUDы не упомянул? Все эти undefined reference to `HB_FUN_... получаются из-за использования функций CTLIB. Но вроде в Харборе такая бублиотека есть. И ссылки на "HB_FUN_..." сделал сам компилятор. Что ж дальше то не пошел?

mikeas: PSP, спасибо, похоже на то. К моему стыду, не знаю как сослаться явно на CTLIB, а перечислять все функии EXTERNAL из CTLIB наверно будет не правильно, вдруг что забуду :) Буду копать.

Andrey: Просто на хХарбор перейти быстрей у меня получилось, да и сейчас это сделать просто. А вот переход на Харбор для новичков - проблема. Может сделать пока переход на хХарбор, а уже потом, набрав опыта, можно переходить на Харбор. Но это решает уже каждый сам. У меня терминалки до сих пор на хХарборе. Уже лет 9-10 (не помню точно). В принципе никакой разницы (для новичков) между хХарбором и Харбором нет.

mikeas: Андрей, может и придется обратиться к хХарбору, если упрусь в стену. Но обидна в самом начале "менять лошадей" :) Вставил строку "EXTERNAL token" не помогает. Вставил "-LC:\hb30\lib\win\mingw\libhbct" в вызов hbmk2, тоже без результатов :( И еще, почему то, Hbmk2 не весь протокол по ... -trace >log.txt выводит в файл. Часть выводится на консоль и улетает вверх безвозвратно :) Вижу только последние: ndefined reference to `HB_FUN_RELC' undefined reference to `HB_FUN_POSREPL' undefined reference to `HB_FUN_MSGSEL' undefined reference to `HB_FUN_BOXSHADOW' undefined reference to `HB_FUN_TOKEN' undefined reference to `HB_FUN_BOXSHADOW' collect2: ld returned 1 exit status hbmk2: Error: Running linker. 1

Dima: mikeas пишет: Вставил "-LC:\hb30\lib\win\mingw\libhbct" -LC:\hb30\lib\win\mingw\hbct.hbc

Andrey: mikeas пишет: C:\hb30\lib\win\mingw\libhbct А зачем делать сразу на MinGw ? Это тормоза при сборке. Для тестирования и работы терминалки лучше BCC, быстрей всё собирается.

petr707: Покажите Ваши hbmk2-файлы проекта - .bat(cmd) .hbp .hbc в hbc обычно достаточно указать что-то вида ... # Harbour contribs {win}libs=hbmzip {win}libs=hbwin.lib hbct.lib hbnf.lib hbrtl.lib {win}libs=hbhpdf.lib libhpdf.lib libpng.lib {win}libs=hbtip.lib hbmisc.lib ... или в hbp ( без .hbc) .. # libs -liphlpapi -lxhb -lhbxpp -lhbmzip -lhbwin -lhbct -lhbnf -lhbhpdf ...

Dima: Andrey пишет: А зачем делать сразу на MinGw ? Это тормоза при сборке. Если нормальный комп , нет тормозов.

mikeas: Спасибо, Dima. Но, увы "не выходит каменный цветок" :) Тот же отрицательный результат. Да и по указанному пути нет тактго файла: hbct.hbc Все файлы здесь: C:\hb30\lib\win\mingw\ имеют расширение .a и начинаются на "LIB..." М.б. я не тот Харбор осваиваю(версия 3.0) и слудует взять чтото поновее? Готовый собранный новее не нашел. Чесно говоря надеялся, что сразу "заведется". Никакой экзотики не использую или еще не дошел до реальных проблем.

Dima: mikeas пишет: Да и по указанному пути нет тактго файла: hbct.hbc тогда просто не указывай расширение вот так -LC:\hb30\lib\win\mingw\hbct

mikeas: Всем спасибо за участие! Думал ко вторнику что нибудь получу :) Вот bldhb.bat: set path=c:\hb30\bin;c:\hb30\comp\mingw\bin hbmk2 calc.prg -LC:\hb30\lib\win\mingw\hbct.hbc -trace >log calc.prg - головной модуль. Пользуюсь инструкцией "Harbour - шаг за шагом" Александра Кресина, т.е. использую версию "harbour-3.0.0-win.exe".

mikeas: Dima, так нет такой библиотеки "hbct" по указанному адресу, там все файлы формата lib... .a М.б. сильно устаревший Харбор юзаю? Чем заменить?

Dima: mikeas Там должен быть файл libhbct.a но при сборке указывать надо hbct PS Тоже сижу на MINGW

PSP: 1. Ключ подключения библы -l ("л" маленькая). -L - для указания пути к библиотекам 2. Не lib, не .a для mingw не указываются 3. Свежий Харбор здесь: https://harbour.github.io/ Скачайте Nightly binary

petr707: = = =bat= = set HB_PLATFORM=win set HB_ROOT=C:\hb30 set HB_BIN_INSTALL=C:\hb30\bin set path=%HB_ROOT%\bin;C:\hb30\comp\mingw\bin;%path% %HB_ROOT%\bin\hbmk2.exe CALC.hbp -oCALC.EXE 1> build_CALC.log 2>error_CALC.log Логи в BUILD_CALC.LOG ERROR_CALC.LOG = = CALC.HBP = = .. -info -trace ... -std #-gtstd #-gtwvt .. # compile options #-m #-n #-es0 -w0 #-mt .. .. # libs -lhbwin -lhbct .. #hbc hbct.hbc .. #source CALC.PRG

mikeas: Dima, PSP, задал hbct(без lib и .a), не находит файла: C:\hb_tst\calc\PRG>hbmk2 calc.prg -lC:\hb30\lib\win\mingw\hbct -trace 1>log gcc.exe: C:/hb30/lib/win/mingw/hbct: No such file or directory hbmk2: Error: Running linker. 1 petr707, в разделе # libs нужно указать все библиотеки из C:\hb30\lib\win\mingw ? или только проблемную? Что за раздел #hbc и что содержит hbct.hbc ?

Dima: mikeas а есть вообще файл libhbct.a ?

PSP: mikeas, скачайте свежий билд. В нем точно есть эта библа. Возможно, что и указывать на нее не придется.

petr707: Перечисляет библиотеки в папке ..\CONTRIB\ hbmk2 будет искать и найдет , в частности, файл C:\hb30\contrib\hbct\hbct.hbc с описанием, где брать библиотеку HBCT = = = = # # $Id: hbct.hbc 16259 2011-02-09 15:58:45Z vszakats $ # incpaths=. libs=${_HB_DYNPREF}${hb_name}${_HB_DYNSUFF}

mikeas: Внимательно всмотрелся в сообщения об ошибках. Увидел там имена и своих модулей. Решил, что надо собрать весь проект, "пусть он развалится" :) Сейчас занимаюсь устранением клипперовских безобразий/безалаберностей :) Их много. Это печалит. Как устраню, опять вас помучаю. Спасибо всем! Искренне рад, что не в одиночестве вожусь! И таки да, файл libhbct.a на месте. Свежий билд скачал.

petr707: есть C:\hb30\lib\win\mingw\libhbct.a - размещение

mikeas: petr707, не понял, Вашу фразу: "есть C:\hb30\lib\win\mingw\libhbct.a - размещение" поясните, пожалуйста. 1) Поправил неряшливости Клиппера 2) Поправил .bat и .hbp файлы по совету petr707 Кол-во ошибок уменьшилось до 11 штук! Похоже таких функций в Харборовской CTLIB действительно нет: `HB_FUN_CSETALL' `HB_FUN_DISKFREE' `HB_FUN_SPLITV' `HB_FUN_FILECHECK' разбираюсь с ними.

petr707: 1) Можно найти аналоги функций или близкие, например FUNction DISKFREE(cDrive) return hb_DiskSpace(cDrive,1) FUNction DISKTOTAL(cDrive) return hb_DiskSpace(cDrive,3) или поставить временные заглушки , например Function filecheck() return 1 2) Фраза про "размещение" - это просто ссылка на пусть к файлу этой библиотеки ( при стандартной инсталляции hrb 3.0) 3) Подтверждаю, что лучше сразу использовать текущий harbour 3.2.0dev , чем стабильный 3.0.0. Не придется переделывать потом. hbmk2 от 3.2 много чего больше умеет, чем hbmk2 от 3.0 и много другое чего продвинуто

mikeas: petr707, спасибо. Так и сделаю. Вопрос: а где Вы берете описания функций? Что-то не нашел :( В Mingui нашел файл: "(x)harbour.chm", но не уверен в достоверности описания, например DISKFREE() там есть.

petr707: Источников много, в том числе и здесь на форуме click here Можно смотреть в инсталляции C:\harbour\ChangeLog.txt , C:\harbour\doc\ Можно использовать в hrb3.2.0dev hbmk2.exe -find xxxxx

mikeas: Ура! Подчистил, собрал, запустил. Работает!!! Но, пока частично :( Подводит клипперовская свобода. Оказывается в Харборе параметры процедур LOCAL, а в Клиппере PRIVATE, например: procedure poisk(p1) p1:=IIF(p1=NIL,"par1",p1) PRIV p2:="par2" MyBrowse( p2 ) RETURN FUNCTION MyBrowse( oBrowse ) ? "oBrowse=", oBrowse ? "p1=", p1 RETURN NIL Харбор выдает ошибку: Error BASE/1003 Variable does not exist: P1 В Клиппере такое прокатывало. Нет ли в Компиляторе Харбора какого переключателя, чтобы считать параметры PRIVATE?

Dima: Параметры процедур и в Clipper локальные. Нужны Private используем , PARAMETERS

mikeas: О, нашел выход. Не красивый, но очень полезный. Вот так срабатывает в Харборе: procedure poisk() PARAM p1 p1:=IIF(p1=NIL,"par1",p1) PRIV p2:="par2" MyBrowse( p2 ) RETURN FUNCTION MyBrowse( oBrowse ) ? "oBrowse=", oBrowse ? "p1=", p1 RETURN NIL

mikeas: Да, точно. Многие модули у мня были без заголовков PROC/FUNC. Повставлял заголовки, ну и втиснул туда параметры не думая о последствиях. Придется заново лопатить все :(

Dima: mikeas пишет: О, нашел выход. я об этом выше и писал :)

mikeas: Да, Dima, Вы правы. Это я не внимательный :( Обнаружил очередную проблему: не работает SET SCOPE ! (Я использую SIXCDX, так исторически сложилось, но похоже в Харборе SIX кривой :( ) Поискал на сайте. Нашел аналогичную проблему, которую описывал wad1 в 2009 году. Решение: полный отказ от SIX. Придется все перепахивать на предмет замены SIX-функций "sx_..." на аналоги. Жаль. Финиш был так близок :)

Dima: mikeas пишет: Обнаружил очередную проблему: не работает SET SCOPE а так #include "dbinfo.ch" dbOrderInfo(DBOI_SCOPETOP........ dbOrderInfo(DBOI_SCOPEBOTTOM....

mikeas: Dima, сори, не понял. Мне не знакомы эти Харбор-функции. Надеюсь если отключить SIXCDX повсеместно в проекте и подключить RDDCDX, то все SCOPe-ы заработают. Или нет? Мне только останется заменить явные вызову SIX-функций на их аналоги. Вот в этом возни много будет. Или м.б. с SIXCDX можно что-то переключить, чтобы SCOPE выполнялись? Вся суть проблемы: минимизировать исправления исходного кода.

Dima: mikeas я бы проверил на простом примере для начала SCOPE c SIXCDX (сомневаюсь что он глючный) а на другом тоже самое с DBFCDX

mikeas: Это разумно, сейчас попробую.

Dima: mikeas Поздно )) [pre2] #include "dbinfo.ch" #include "hbsix.ch" Proc main Local el Request SIXCDX dbcreate("testsix",; {{"ndok","n",5,0}},"SIXCDX",.t.,"testsix") index on ndok tag test for each el in {1,1,2,2,3,3} testsix->(dbappend()) testsix->ndok:=el next testsix->(dbgotop()) testsix->(browse()) testsix->(dbOrderInfo(DBOI_SCOPETOP,,,3)) testsix->(dbOrderInfo(DBOI_SCOPEBOTTOM,,,3)) // так не работает //testsix->(sx_setscope(0,3)) //testsix->(sx_setscope(1,3)) testsix->(dbgotop()) testsix->(browse()) return [/pre2]

mikeas: Dima, спасибо. Я тоже убедился, что SIX не работает на своем примере. Убираю его нафиг. Перехожу на DBFCDX.

mikeas: Еще обнаружил такой эффект: оказывается если установить SCOPE без SIXа, то фунуции SIXа: sx_keyno() - тек.номер записи в индексе и sx_keycount()-кол-во записей в индексе показывают правильные числа с учетом установленного SCOPE. Т.е. можно рискнуть и функции SIXа(хотя бы эти) не переназначать! И это радует :)

Dima: mikeas пишет: sx_keyno() - тек.номер записи в индексе и sx_keycount()-кол-во записей в индексе это все есть в DBFCDX DbOrderInfo(DBOI_KEYCOUNT) DbOrderInfo(DBOI_KEYNO)

mikeas: Очередная засада: не срабатывает команда KEYBOARD <cSTRING> внутри GETа. Пока не знаю что и предпринять :( М.б. у кого была такая же беда, сориентируйте, плиз.

azoo: mikeas , пример кода покажите. В каком смысле "внутри" ?

Dima: mikeas пишет: не срабатывает команда KEYBOARD <cSTRING> пробни Hb_keyins

petr707: HB_KEYPUT - тоже можно

mikeas: Оказалось дело не в KEYBOARDe. Привожу ниже пример. В функции HELP заменил отсутствующую в Харборе функцию CSETALL на самодельную. И она сделала свое черное дело - отключила как то вставку по команде KEYBOARD "123qwe". Убираю восстановление всех установок(// CSETALL(cur_set)) все работает! Теперь думаю что не так, чем бы CSETALL() заменить? [pre2]#include "Inkey.ch" #include "Set.ch" procedure tstboardk() PRIV p1:=" " SET KEY K_F1 TO help CLEAR @ 09, 10 SAY "->" GET p1 READ RETURN ******************************* FUNCTION help() PARAMETERS prog_name, line_num, input_var, nrec PRIV cur_set cur_set = CSETALL() KEYBOARD "123qwe" // CSETALL(cur_set) RETURN NIL ******************************* FUNCTION CSetAll( aNewSets ) LOCAL aCurrentSets[_SET_COUNT], nCurrent IF ( aNewSets != NIL ) // Set new and return current FOR nCurrent := 1 TO _SET_COUNT aCurrentSets[nCurrent] := ; SET(nCurrent, aNewSets[nCurrent]) NEXT ELSE FOR nCurrent := 1 TO _SET_COUNT aCurrentSets[nCurrent] := SET(nCurrent) NEXT ENDIF RETURN (aCurrentSets) [/pre2]

Dima: mikeas пишет: Теперь думаю что не так, чем бы CSETALL() заменить? Не понял для чего она в этой задаче , тем более что без нее все работает ? В функции help() ни чего же не меняется в плане установок.

mikeas: Это в примере ничего не меняется. В реале меняется. Csetall применял от лени, каюсь и выбрасываю ее. Посмотрел внимательней в HELP-е родном надо только сохранять softseek и cursor. Едем дальше :)

PSP: mikeas пишет: Убираю восстановление всех установок(// CSETALL(cur_set)) все работает! В числе прочих SET-ов там есть _SET_TYPEAHEAD, при установке которого происходит очистка буфера клавиатуры. Цитата: "When executed, SET TYPEAHEAD clears the keyboard buffer and sets the size to <nKeyboardSize>." http://www.ousob.com/ng/53guide/ngf1c3d.php

mikeas: PSP, ОК, спасибо! Продолжаю продвигаться дальше через мелкие, но вредные ляпы :) 1) Обнаружил в вызове MEMOEDIT разночтение в параметрах: в Клиппере отсутствующую пользовательскую функцию задавал как "..,'',...", а Харбор потребовал "...,,..." 2) Столкнулся: Клиппер все имена файлов создавал в верхнем регистре, Харбор так как задашь!

mikeas: Еще одна печаль с докой. Думал вот здесь уж точно все есть: http://www.elektrosoft.it/tutorials/Harbour-Reference-Guide/harbour-reference-guide.htm Не нашел MEMOEDIT()! :( Надыбал старинный NG-справочник Clipper 5.3, но это компромис :(

Dima: mikeas пишет: Не нашел MEMOEDIT Он слегка сырой я бы сказал. Используй поиск на форуме по MEMOEDIT или (что лучше) HBEDITOR Справку можно взять тут __http://www.spb4plus.ru/old/comment/reply/114 , в самом низу линк на rar архив

nick_mi: Вместе с МиниГуи поставляется HELP для HARBOUR , там тоже есть описание memoedit

mikeas: Еще обнаружил: ATREPL(aCH[i,1],@buf,aCH[i,2]) -не сработало в Harbour Ничего не меняется, хотя в Клиппере работает. Пришлось заменить на: buf:=STRTRAN(buf,aCH[i,1],aCH[i,2]) В HELP для HARBOUR из МиниГуи нашел и MEMOEDIT, и ATREPL (где как раз обнаружил отсутствие возможности задать параметр по ссылке - @buf ) А что за файлы *.hbd в C:\hb32\doc ? Подозреваю, что документация/описание. Ими как-то можно пользоваться? Чем их открывать?

petr707: Поиск на этом форуме по "hbd" дает ссылку click here

mikeas: petr707, пошел по ссылке. Прочитал. Теперь не найду HBIDE в C:\hb32\contrib Забыли положить? Не там ищу? Или чего то не понял?

Dima: mikeas пишет: Теперь не найду HBIDE в C:\hb32\contrib [pre2] 2012-09-27 12:11 UTC+0200 Viktor Szakats (vszakats.net/harbour) - contrib/hbide - contrib/hbqt - contrib/hbxbp - deleted hbqt, hbxbp, hbide as final step of contrib split to separate project. find them in this (temporary) repository: http://sourceforge.net/projects/qtcontribs/ or checkout from Harbour repository using: svn co -r 18153 https://harbour-project.svn.sourceforge.net/svnroot/harbour-project/trunk/harbour [/pre2]

mikeas: Dima, спасибо, но это для меня что-то слишком слжно, пока. Ладно, фиг с ними с .hbd файлами.

mikeas: Обнаружил совсем не хороший эффект, который заключается в следующем: При выполнении комманды: USE (WorkPath+"w1") EXCLUSIVE NEW Харбор пытается открыть одноименный индекс CDX для открываемого файла, а у меня такого не предусмотрено! Как бы отказаться от такого автоматического открытия индекса? Нет ли какого переключателя? Я то в Клиппере использовал SIX и IDX индексы, которые такого не предусмативают. Как выход посматриваю на переход к ntx, но по моему в них нет возможности условного индекса и SCOPE. Прямо караул!

PSP: mikeas пишет: Харбор пытается открыть одноименный индекс CDX для открываемого файла, а у меня такого не предусмотрено! Как бы отказаться от такого автоматического открытия индекса? Нет ли какого переключателя? SET AUTOPEN .F.

mikeas: Убрал DBFCDX по умолчанию, перестроил индексы на NTX. Тестирую. Вроде все что было под вопросом(и условный индекс и SCOPE) работают. Что удивительно, читаются мемо из FPT ф-ла.

PSP: mikeas пишет: Убрал DBFCDX по умолчанию, перестроил индексы на NTX. Тестирую. Вроде все что было под вопросом(и условный индекс и SCOPE) работают. CDX лучше. Странно, что у вас какие-то с ним проблемы. Драйвер работает отлично.

mikeas: PSP, cпаибо. Класс, оказывается есть переключатель! Интересно, а условный индекс в NTX предусмотрен?

mikeas: PSP, так ничего странного. Я ж не новую программу пишу, а вынужденно пересобираю под 32bitб которую пока все Windows поддерживают. Стараюсь минимизировать изменения кода. Программа писалась давно и такие эффекты в ней не предусмотрены были. А чтобы, выполняя USE..., открывать одноименный временный индекс от другого dbf-файла, такого в страшном сне не приснится. А чем CDX лучше? (доп.функционал не рассматриваем) А волшебное заклинание: "SET AUTOPEN .F." нигде больше и не нашел. Плохо конечно искал :)

PSP: mikeas пишет: А чтобы, выполняя USE..., открывать одноименный временный индекс от другого dbf-файла, такого в страшном сне не приснится. Ну, это не проблема драйвера, а проблема программиста )) А чем CDX лучше? (доп.функционал не рассматриваем) По мне - с ним удобнее работать. В одном файле несколько индексов, каждый под своим именем. Не буду утверждать, но, по-моему, он быстрее, чем NTX.

Andrey: mikeas пишет: Убрал DBFCDX по умолчанию, перестроил индексы на NTX. Тестирую. Фигня NTX - потом опять будешь переделывать под CDX ! Всё равно потом руководство что-нибудь захочет, и придётся переделывать ! PSP пишет: Ну, это не проблема драйвера, а проблема программиста )) +1 ! PSP пишет: Не буду утверждать, но, по-моему, он быстрее, чем NTX. Быстрей. И не помню, но на больших базах с NTX как то по другому нужно делать. Не помню точно, давно было.

mikeas: Andrey, спасибо за комментарий. Используя SET AUTOPEN .F. (исключительно для экономии времени, чтобы не пересматривать весь код на предмет возможных ошибок) мне сейчас переключиться с NTX на CDX и обратно как 2 пальца... очень просто. Нужно только убрать/вставить команду DBFCDX по умолчанию и все пересобрать. Просто сознательно (ну так исторически сложилось) не использую всех возможностей CDX.

Andrey: mikeas пишет: Просто сознательно (ну так исторически сложилось) не использую всех возможностей CDX. Ну я тоже всех возможностей не использую. Потом со временем дойдут руки и для других возможностях CDX. Я вообще делаю имя индекса отличное от имени базы. Например база city.dbf, а индексы делаю city1.cdx, city2.cdx, city3.cdx Хотя можно держать в одном индексном файле, но как делал давно под ntx, так и оставил до сих пор. Это не принципиально сейчас для перевода в Харбор.



полная версия страницы