Switch to English Александр Кресин
Главная Clipper HwGUI Harbour Утилиты
Ссылки Five stones KS Organizer Мое фото

Harbour для начинающих
Как установить Harbour и откомпилировать на нем свою программу.


Александр Кресин
Октябрь 2003




1. Установка

Официальные дистрибутивы Харбора находятся на Sourceforge. Там выложены как исходники, так и готовые к работе бинарники ( exe и lib ). Если вы скачаете исходники, то вам надо будет откомпилировать из них сам Харбор. Это не трудно, но, возможно, для начинающего ни к чему. Это может быть полезным, если вы захотите получить самую свежую версию Харбора с CVS ( официальные версии выходят далеко не каждый день ).

Есть один важный вопрос, который вам надо решить для себя сразу, до скачивания дистрибутива Харбора - это вопрос о С компиляторе.
Дело в том, что сам компилятор Харбор не создает объектные файлы ( obj, o ), результатом его работы является *.c файл, который надо затем скомпилировать С компилятором, чтобы получить exe'шник. Но пусть это вас не пугает ! Вам не обязательно знать для этого С - достаточно, чтобы С компилятор был у вас установлен. А использование его для компиляции и линковки ваших файлов ничуть не сложнее, чем использование Rtlink или Blinker'а.
Если вы работаете в Линуксе, то C компилятор у вас уже есть - это стандартный GNU C. если же ваша платформа - Win32, то надо выбирать. Большинство тех, кто работает с Харбором, использует бесплатный Borland C 5.5.1, его можно скачать с ftp://ftpd.borland.com/download/bcppbuilder/freecommandLinetools.exe. Если у вас уже стоит C++ Builder или Visual C, можете использовать их. Еще один хороший C компилятор - Mingw http://www.mingw.org.

Примечание для тех, кто будет устанавливать Borland C 5.5.1 и не прочитает их readme.txt: чтобы он работал, необходимо вручную создать в bcc55\bin 2 файла:
BCC32.CFG:

 -I"c:\Borland\Bcc55\include"
-L"c:\Borland\Bcc55\lib"
и ILINK32.CFG:
 -L"c:\Borland\Bcc55\lib;c:\Borland\Bcc55\lib\PSDK"

Кстати, чтобы запустить на исполнение небольшую программу, вы можете обойтись и без С.

1.1 Устанавливаем бинарники Харбора
Установка бинарников сводится, собственно, к распаковке дистрибутива.

1.2 Устанавливаем Харбор из исходников

Чтобы построить Харбор - компилятор и библиотеки, нам нужен опять-таки C компилятор и две утилиты - Flex и Bison ( лексический анализатор ). Все это включено в любую Unix систему, а для Windows их надо скачать - например, с http://gnuwin32.sourceforge.net/packages.html.

1.2.1 Borland C

Итак, у вас есть Borland C и Flex с Bison'ом - разместите эти две утилиты в каталоге, который прописан у вас в пути ( set path=... ).Удостоверьтесь, что путь к bcc32.exe ( bcc55/bin ) также указан в set path, и что он стоит там раньше, чем какой-нибудь другой компилятор.

Теперь запускаете на исполнение harbour/make_b32.bat - и все !

1.3 Что такое CVS

Подробнее о CVS и как его использовать, вы можете прочитать в документации - это небольшой ( 169К ) zip архив.
А я расскажу об этом коротко - в применении к Харбору.

Итак, CVS - это программа с серверной и клиентской частями, которая позволяет разработчикам, у которых установлены клиентские части, совместно работать с исходниками проекта, которые находятся на сервере ( в Интернет или в локальной сети ), разрешает конфликты, возникающие при одновременном изменении одного файла разными людьми. При этом CVS обеспечивает и контроль версий - т.е., все версии каждого файла хранятся, могут быть извлечены, восстановлены; можно проверить, кем и какие изменения были сделаны.
Очень удобная штука, рекомендую и для внутреннего использования в подразделении.

Разработчики Харбора используют для доступа к CVS бесплатный сервис, предоставляемый SourceForge.net.
Установив CVS клиент, вы можете получить доступ к исходникам Харбора - самому последнему варианту, как у разработчиков. В первый раз вам придется скачать полный набор ( ~16M ), при последующих обращениях передаваться будут только изменения.
Вам надо выбрать одну из нескольких клиентских программ, две из них будут рассмотрены ниже.

1.3.1 CVS-клиент: GUI (Tortoise)

Это довольно удобная программа, которыю можно взять на http://www.tortoisecvs.org/. После установки у вас добавятся новые строчки в контекстном меню, появляющемся при щелчке по файлу в "My computer" или Windows Explorer.
Итак, щелкаете правой кнопкой мыши по папке, куда хотите скачать исходники и выбираете в меню "CVS checkout". В диалоговом окошке указываете следующие параметры:

        Protocol:                           Internet (Unix pserver)
        Server:                              harbour-project.cvs.sourceforge.net
        Repository directory:         /cvsroot/harbour
        User name:                        anonymous
        Module:                             harbour

Жмете "ОК" - и в путь !

1.3.2 CVS-клиент: консольный

Скачиваете с Харборовского сайта http://www.harbour-project.org/download.htm CVS_DOS, распаковываете, например, в C:\CVS и создаете там же bat файл следующего содержания:

  @echo off
  SET CVSROOT=:pserver:anonymous@harbour-project.cvs.sourceforge.net:/cvsroot/harbour-project
  SET HOME=C:\CVS
  cvs login
  cvs checkout -P harbour
В ответ на приглашение ввести пароль просто жмите ENTER.


2. Компиляция и линковка программы

Последовательность действий здесь простая:

1. Компилируем *.prg в *.c с помощью harbour.exe.
Параметры компилятора, в основном, те же, что и у Клиппера. Полный их список можно получить, запустив harbour.exe без параметров. В одной строчке можно указывать несколько prg файлов.
2. Компилируем *.с в объектные файлы вашим С компилятором.
3. Линкуем объектные файлы тем линкером, который поставляется с С компилятором.
При линковке надо обязательно указать список Харборовских библиотек, которые нужны вашему приложению.
Все используемые с Харбором С компиляторы позволяют объединить шаги 2 и 3 - делайте, как вам нравится.

2.1 Win32, Borland C

Ниже приведен bat'ник, которым я обычно пользуюсь, чтобы скомпилировать 1 prg:

  @set HB_BIN_INSTALL=d:\harbour\bin
  @set HB_LIB_INSTALL=d:\harbour\lib\
  @set HB_INC_INSTALL=d:\harbour\include\

   %HB_BIN_INSTALL%\harbour %1.prg -n -i%HB_INC_INSTALL%
   bcc32 -O2 -d -I%HB_INC_INSTALL% -L%HB_LIB_INSTALL% %1.c debug.lib vm.lib rtl.lib gtwin.lib lang.lib rdd.lib macro.lib pp.lib dbfntx.lib dbfcdx.lib common.lib codepage.lib
Если вам надо построить программу из нескольких файлов, то можно использовать что-либо вроде этого:
  @set HB_BIN_INSTALL=d:\harbour\bin
  @set HB_LIB_INSTALL=d:\harbour\lib\
  @set HB_INC_INSTALL=d:\harbour\include\

   %HB_BIN_INSTALL%\harbour file1.prg -n -i%HB_INC_INSTALL%
   %HB_BIN_INSTALL%\harbour file2.prg -n -i%HB_INC_INSTALL%
   ...
   bcc32 -O2 -d -I%HB_INC_INSTALL% -L%HB_LIB_INSTALL% file1.c file2.c ... debug.lib vm.lib rtl.lib gtwin.lib lang.lib rdd.lib macro.lib pp.lib dbfntx.lib dbfcdx.lib common.lib codepage.lib

2.2 Win32, Mingw

2.3 Linux

2.4 Как обойтись без С

Да, вы можете скомпилировать свою программу и запустить ее на исполнение и без С компилятора ! Harbour.exe может создать из вашего prg специальный p-code файл ( наподобие Fox'овского fxp ), небольшой по размеру, который можно исполнить с помощью утилиты Hbrun.exe - она входит в комплект дистрибутива.

Итак, компилируйте программу с ключом /gh ( остальный ключи - /n, /w, ... - как обычно, по необходимости ) :
  harbour.exe my.prg /gh
Если компиляция завершится без ошибок, вы получаете файл my.hrb и исполняете его:
  hbrun.exe my.hrb [ параметры ]
где параметры - это те параметры, с которыми вы запускаете свою программу.
Есть тут, правда, одно досадное ограничение: таким образом вы можете скомпилировать программу только из одного prg.


3. Отличия от Клиппера - краткое описание

Харбор создавался как полностью совместимый с Клиппером компилятор. Это значит, что любая ваша программа, написанная на Клиппере, должна без проблем компилироваться Харбором и работать так же, как если бы она была откомпилирована Клиппером. Во многих случаях так оно и есть, но, конечно, могут возникать и проблемы - не все получается так, как задумано, Харбор не свободен от ошибок и недоделок.
Еще один возможный источник проблем при переходе с Клиппера на Харбор - это дополнительные библиотеки, вставки на С и ассемблере, если вы их используете - 16-разрядные объектники не прилинкуются к 32-разрядному приложению. Если у вас есть исходники этих модулей, то можно попробовать перекомпилировать их, хотя и тут успех не гарантирован - не все функции 16-разрядного С компилятора доступны в 32-разрядном.

Но, конечно же, Харбор не просто повторяет функциональность Клиппера, а существенно расширяет ее - иначе какой был бы в этом смысл ?! Помимо расширений, связанных с переходом от 16 к 32 разрядному коду ( снятие ограничений по памяти, по размерности массивов и длине строк ), Харбор предлагает и языковые расширения, и дополнительные функциональные возможности. Они и будут рассмотрены ниже.
Сразу хочу предупредить, что этот перечень будет неполным - о чем-то я могу забыть, что-то не написать просто из-за нехватки времени и терпения. Начну с немногого, потом постепенно, по мере возможности, буду пополнять этот список и расширять описания. Рекомендую вам также воспользоваться документацией с http://www.harbour-project.org/download_docu.htm. Она, правда, тоже не полная, и, к тому же, не на русском - но, даже если у вас с английским проблемы, что-нибудь полезное вы оттуда все равно почерпнете - хотя бы названия новых функций, образцы синтаксиса, и т.д.

3.1 Реализация ООП

3.2 Lang API (язык программы)

Эта подсистема предназначена для вывода аварийных сообщений и результата функций CMonth(), CDow() - но, в отличие от аналогичных средств в Клиппере, она позволяет менять язык программы во время исполнения.
Чтобы подключить ее к вашему приложению, надо указать в link - скрипте библиотеку lang.lib и включить в главный prg файл предложения REQUEST с именами тех языков, которые вы предполагаете использовать, например:

  REQUEST HB_LANG_RU866
  REQUEST HB_LANG_RUWIN
Hb_LangSelect( cLangID ) --> cLangIDУстанавливает язык программы, возвращает ID предыдущего языка.
Hb_LangName() --> cLangIDВозвращает название языка программы.
Hb_LangErrMsg( nError ) --> cErrorВозвращает текст ошибки по номеру.
Hb_LangMessage( nMessage ) --> cMessageВозвращает текст аварийного сообщения по номеру.

3.3 Codepage API

Эта подсистема обеспечивает поддержку национальных кодовых страниц для ваших данных. Чтобы подключить ее к вашему приложению, надо указать в link - скрипте библиотеку codepage.lib и включить в главный prg файл предложения REQUEST с именами тех кодовых страниц, которые вы предполагаете использовать, например:

  REQUEST HB_CODEPAGE_RU866
  REQUEST HB_CODEPAGE_RUKOI8
  REQUEST HB_CODEPAGE_RU1251

Далее, следует определить главную кодовую страницу приложения. Именно эта кодовая страница будет использоваться для функций IsUpper(), IsLower(), IsAlpha(), Upper(), Lower(), Transform() и при сравнении строк. В консольном приложении, по-видимому, следует использовать "RU866", а в Windows GUI приложении - "RU1251".
Для установки главной кодовой страницы используется функция

  Hb_SetCodepage( sCodepage )
   например:
  hb_SetCodepage( "RU866" )

Подобная возможность есть и в Клиппере ( путем подключения специальных obj ), но в Харборе, кроме того, можно определить кодовую страницу для любого открываемого файла данных - при этом все строки будут автоматически транслироваться в главную кодовую страницу приложения при чтении и обратно - при записи, транслироваться будут и строки в dbSeek(), dbLocate(), dbSetFilter(). Достаточно указать кодовую страницу при открытии файла - и вся последующая работа с ним будет выглядеть так, как будто данные находятся в основной кодовой странице:

   USE file_name ... CODEPAGE "RU1251"
   или
   dbUseArea( .T.,,file_name,,.T.,.F.,"RU1251" ) 

По умолчанию файл открывается с главной кодовой страницей приложения.
Эту возможность ( определение кодовой страницы файла ) следует использовать только с родными RDD - DBFNTX и DBFCDX.
ADS RDD предоставляет для этих целей другие средства ( настройка ini файла или SET CHARTYPE TO OEM/ANSI ).

Codepage API включает также функцию для трансляции строк из одной кодовой страницы в другую:

   Hb_Translate( sData, sCodepageIN, sCodepageOUT )
   например:
   Hb_Translate( "Привет", "RU1251", "RU866" )

3.4 Работа с hrb - файлами

Я уже отмечал здесь, что Харбор может вместо С файла создать из вашего prg особый тип файла с расширением hrb, который содержит p-code вашей программы и может быть исполнен утилитой Hbrun.exe.
Но этот hrb может быть вызван на исполнение и непосредственно из вашей программы - для этого предусмотрены специальные функции:
__hrbRun( hrbName, ... (параметры))Исполняет hrb файл с именем hrbname, передает ему список параметров и возвращает результат.
__hrbLoad( hrbName ) --> handleЗагружает в память инструкции из hrb файла с именем hrbname, возвращает указатель на эти инструкции.
__hrbDo( handle, ... (параметры))Исполняет инструкции из hrb файла, на которые указывает handle, передает им список параметров и возвращает результат.
__hrbUnload( handle )Выгружает инструкции, на которые указывает handle, из памяти.
  
__hrbGetFu( handle, functionName )Получает указатель на функцию с именем functionName, определенную hrb файле; предварительно надо загрузить этот hrb в память с помощью __HRBLOAD( hrbName ).
__hrbDoFu( funcHandle, ... (параметры) )Выполняет функцию, на которую указывает funcHandle, передает ей список параметров и возвращает результат.

Обратите внимание на функции __hrbGetFu() и __hrbDoFu() - фактически hrb используются как своего рода dll из Харборовских функций.

Необходимо проследить, чтобы приложение было собрано со всеми функциями, которые могут вызываться из .hrb, иначе во время исполнения программа вылетит. Лучше всего это сделать, поставив в вашей программе

  REQUEST <имя_функции>
Можно включить #include "hbextern.ch" - в нем собраны REQUEST на все Харборовские функции. Размер программы в результате, конечно, увеличится, зато у вас будет гарантия, что все функции включены.

3.5 Встроенный С

В Харборе есть возможность вставлять фрагменты С кода в prg файл. Это может быть удобно, если вам лень из-за пары нужных С функций создавать .с файл и вставлять его в проект. Делается это при помощи директив #pragma BEGINDUMP ... #pragma ENDDUMP.

#pragma BEGINDUMP
   #include < extend.h >
   #include < math.h >
   HB_FUNC( SIN )
   {
      double x = hb_parnd(1);
      hb_retnd( sin( x ) );
   }
#pragma ENDDUMP

3.6 Встроенный препроцессор

3.7 Прочие функции

4. Дополнительные библиотеки ( Contributions )

Для Харбора написано уже больше десятка дополнительных библиотек, расширяющих его функциональность. Большинство из них находятся в том же CVS репозитарии, где и исходники самого Харбора, в каталоге contrib/.

4.1 Clipper Tools

4.2 ADS RDD

ADS - Advantage Database System производства компании Extended Systems, клиент-серверная RDBMS, работающая с dbf и adt ( специальный формат, разработанный Extended Systems ). Многие программисты, работающие на Клиппере, хорошо знают этот продукт, т.к. существует RDD для Клиппера, обеспечивающий доступ к ADS серверу и работу в режиме клинт - сервер. Если вы не знакомы с ADS, загляните на http://dimma.da.ru, там на Клиппер - страничке много об этом говорят.

RDD для доступа к ADS серверу написан и под Харбор. В отличие от Клипперовского, он позволяет работать и с adt таблицами, поддерживает дополнительные типы данных и позволяет работать не только с удаленным ADS сервером, но и с локальным. Дело в том, что удаленный ADS сервер - это не дешевая штука, он стоит, как и другие клиент - серверные DBMS, несколько тысяч $ ( хотя есть и лекарства :) ). А вот клиентская часть и локальный сервер - тот, что позволяет работать на локальном или удаленном компьютере не в клиент-сереверном режиме, бесплатны, их можно скачать с сайта Extended Systems, предварительно зарегистрировавшись, или с http://www.harbour-project.org/download.htm без всякой регистрации. Таким образом, имея 2 dll'ки и слинковав свою программу с RDD ADS, вы можете легально и бесплатно работать с этим продуктом.

Работает локальный ADS несколько медленнее, чем родные RDD ( DBFNTX и DBFCDX ), но имеет ряд преимуществ перед ними.
Во - первых, он заведомо надежен, т.к. проверен в течении многих лет десятками тысяч пользователей.
Во - вторых, он предоставляет ряд дополнительных возможностей, в т.ч. - шифрование данных, оптимизированные фильтры, возможность использования SQL, дополнительные типы данных, доступ к adt - таблицам ...

Документации по ADS RDD не много и она на английском, вы найдете ее в contrib/rdd_ads/doc. Рекомендую также посмотреть файл исходников adsfunc.c - там вы найдете все дополнительные функции.

Итак, что нужно, чтобы подключить ADS RDD к вашей программе ?

4.3 MySQL

4.4 ODBC

4.5 OLE/ActiveX