Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

ГЛАВА 10. Создание библиотек Quick и автономных библиотек.

Библиотека-это собрание процедур, которые были скомпилированы или ассемблированы для получения набора объектных модулей, которые затем могут быть использованы программами Quick-C. Пакет Quick-C обеспечивает инструментальные средства для создания и обработки двух типов бибиотек, легко различающиеся по их характерному расширению:

Расши-           Значение
рение


.QLB  Обычно обозначает библиотеку "Quick", это тип библиотеки, соз-
      даваемый утилитой LINK, и используемый программами компилируе-
      мыми и выполняемыми в среде разработки программ Quick-C.
.LIB  Расширение .LIB характеризует библиотеку, созданную библиотеч-
      ным диспетчером LIB. Данные библиотеки называются обычно "авто-
      номными" и имеют тот же самый формат, что и библиотеки, приме-
      няемые в других языковых высокоуровневых продуктах фирмы
      Microsoft.

10.1. Библиотеки Quick.

Библиотеки Quick используются в программах, компилируемых и выполняемых в программной среде Quick-C. Бибилиотеку Quick следует загрузить, если вы хотите получить полный список стандартных библиотечных процедур СИ, встроенных в программную среду Quick-C.

10.1.1. Создание библиотек Quick.

В библиотеку Quick можно объединить объектные файлы, автономные библиотеки, либо любую их комбинацию. Когда вы подключаете к библиотеке Quick автономную библиотеку, все модули данной библиотеки становятся частью библиотеки Quick.

Библиотеку Quick можно создать с помощью следующих шагов: 1. Скомпилируйте исходные файлы СИ, которые вы хотите включить в библиотеку. Поскольку модули в библиотеке Quick должны использовать среднюю модель памят, компиляцию выполняйте либо с выходной опцией obj в программной среде Quick-C, либо с опцией /AM в командной строке QCL. 2. Вызовите компановщик, либо из командной строки, либо с помощью программы LINK. Задайте QUCKLIB.OBJ в качестве первого имени объектного файла в командной строке, либо в ответе на запрос Object Files. (Файл QUICKLIB.OBJ находится на дистрибутивном диске Libraries#1 пакета Quick-C). Затем задайте имена объектных файлов и автономных библиотек, которые вы объединяете. Задайте имя библиотеки Quick в командной строке в качестве имени выполняемого файла, либо в ответе на запрос Run File. Чтобы создать библиотеку Quick задайте опцию компановщика /Q. -Пример:

    QCL QUICKLIB /AM CRCL.C ELPS.C LINE.C CRV.C /FeSHAPES.QLB /link /Q
Командная строка QCL, приведенная выше, создает библиотеку Quick с именем SHAPES.QLB из исходных файлов CRCL.C, ELPS.C, LINE.C и CRV.C.

10.1.2. Загрузка библиотек Quick.

Чтобы загрузить библиотеку Quick при старте пакета Quick-C, используйте командную строку в следующей форме:

    QC/lqlibname

В данной командной строке qlibname-это базовое имя библиотеки Quick(имя без расширения .QLB).

Если библиотека Quick имеет другое расширение, вам следует задать имя файла с расширением. Библиотеки Quick, если используются, должны быть загружены при старте среды Quick-C. Каждый раз при старте Quick-C вы можете загрузить только одну из библиотек Quick.

Quick-C ищет библиотеки Quick в следующих местах и в следующем порядке:

1. По маршруту, определенному в имени библиотеки Quick, если он задан.

2. В текущем каталоге.

3. По маршруту, заданному в переменной среды LIB. (Информацию о переменных операционной среды вы найдете в руководстве пользователя по операционной системе DOS).

-Пример:

    QC /lGRAPHICS.QLB

Команда, приведенная выше, загружает библиотеку Quick с именем GRAPHICS.QLB, которая содержит графические функции Quick-C. (Данная библиотека Quick поставляется, как часть пакета Quick-C).

10.1.3. Стандартные библиотечные процедуры в библиотеках Quick.

В таблице 6.1. Разделе 6.1.1. "Одномодульные программы" приведен список стандартных процедур СИ, встроенных в среду Quick-C. Вы можете вызвать эти процедуры из ваших программ без загрузки библиотеки Quick. Как вы можете увидеть из Таблице 6.1, многие из функций стандартных библиотек СИ определены в программной среде Quick-C. Однако, если ваша программа использует стандартные библиотечные процедуры, которые не определены в программной среде Quick-C, у вас есть на выбор несколько средств.

Если ваша программа использует библиотечные процедуры (например getchar()), которые работают как макрокоманды, просто скопируйте директиву #include для соответствующего заголовочного файла в ваш исходный файл.

Если ваша программа вызывает библиотечные функции, используйте следующие процедуры для создания и загрузки библиотеки Quick, содержащей данные функции:

1. Создайте исходный файл, содержащий программу main, которая состоит только из вызовов данных библиотечных процедур, которые вы хотите иметь в библиотеке Quick. Например, если вы хотите создать библиотеку Quick, содержащую процедуры из библиотеки исполняющей системы Microsoft-C, для интерфейса к системе BIOS, вам следует создать следующий исходный файл с именем BIOS.C.

         #include <bios.h>
         main()
         {


             _bios_serialcom();
             _bios_disk();
             _bios_equiplist();
             _bios_keybrd();
             _bios_memsize();
             _bios_printer();
             _bios_timeofday();
         }
Заметьте, что компилятор может высветить предупреждения, пос кольку реальные аргументы, передаваемые функциям в программе отсутсвуют. 2. Скомпилируйте и скомпануйте исходный файл, как описано в Разделе 10.1.1. В данном примере вы можете использовать команды QCL и LINK нижеследующим образом:

    QCL /C /AM BIOS.C
    LINK QUICKLIB.OBJ + BIOS.OBJ, BIOS.QLB, , /Q;
3. Загрузите, как обычно, результирующую библиотеку Quick. В данном примере используйте следующую команду:

    QC /lBIOS

10.2. Управление автономными библиотеками: Утилита LIB.

Администратор библиотек LIB используется для управления содержимым автономных библиотек. Автономная библиотека состоит из "объектных модулей"-то есть объектных файлов, объединенных в библиотеку. В отличие от объектных файлов, объектные модули не существуют отдельно от бибилиотек, к которым они принадлежат, и не имеют ни наименования маршрута, ни расширения.

Утилита LIB используется:

1. Для объединения объектных файлов в новую библиотеку. 2. Для добавления объектных файлов к существующей библиотеке. 3. Для удаления и замены объектных файлов в существующей библиотеке. 4. Для извлечения объектных модулей из существующей библиотеки и помещения в отдельные объектные файлы.

5. Для объединения содержимого двух существующих библиотек в одну новую библиотеку.

Для формирования автономной библиотеки могут быть объединены объектные файлы, автономные библиотеки, библиотеки идеологии Intel и архива XENIX, причем в любом сочетании.

Автономные библиотеки обычно распознаются по их расширению .LIB, хотя допустимы и другие расширения.

При обновлении существующей библиотеки утилита LIB выполняет все операции с копией библиотеки. Данный механизм гарантирует, что вы всегда будете иметь резервную копию обновляемой библиотеки.

10.2.1. Запуск утилиты LIB.

Если вы работаете с утилитой LIB на системе с жестким диском, выполните сначала команду DOS CD, чтобы сделать текущим каталог, в котормй находятся нужные вам объектные файлы или библиотеки. Если вы запускаете LIB на системе с гибкими дисками, установите в дисковод А рабочую копию вашей дистрибутивной дискеты Libraries#1, а дискету, содержащую ваши объектные файлы или библиотеки в дисковод В. Входную информацию для утилиты LIB можно задать одним из следующих способов:

-Заданием входной информации в командной строке в следующей форме:

    LIB oldlib[/P[ANESIZE]:number][command][,[listfile][,[newlib]]][;]
Командная строка не может превышать 128 символов.

-Вводом:

    LIB

и ответом на следующие запросы:

    Library name: (имя библиотек)
    Operations: (действие)
    List file: (файл перекрстных ссылок)
    Output library: (выходная библиотека)
Чтобы задать в ответ на один запрос больше файлов, введите в конце строки амперсэнд (&). Запрос снова появится на следующей строке, и вы можете продолжить ввод ответа на запрос.

-Созданием файла с ответом на запросы команды LIB, известного под названием "файл ответов", затем вводом команды LIB в следующей форме:

    LIB @ filename ,

где filename-имя файла ответов. Ответы должны быть даны в том же порядке, что и на запросы команды LIB, описанные выше. Имя файла ответов можно также ввести и после запроса компановщика, либо в любой позиции командной строки LIB.

В Таблице 10.1 приведена входная информация, задаваемая вами в командной строке LIB, либо в ответе на каждое сообщение.

                                                 Таблица 10.1.
                    Входная информация команды LIB.

Поле       Запрос      Входная информация


oldlib    Library name Имя библиотеки, которую вы изменяете , либо
                       создаете. Если данная библиотека не существу-
                       ет, LIB просит вас ее создать. Введите Y для
                       создания новой библиотеки, либо N-для прерыва-
                       ния работы LIB. Данное сообщение подавляется,
                       если вы введёте командные символы, запятую,
                       либо точку с запятой вслед за именем библиоте-
                       ки. При точке с запятой утилита LIB выполняет
                       контроль библиотеки, высвечивая сообщение при
                       обнаружении ошибок в любом библиотечном модуле
/P:number /P:number    Устанавливает для библиотеки размер страницы в
          в ответе на  number байтов, где number-это целое число, яв-
          запрос "Lib- ляющееся степенью двойки до 16 степени, 32768
          rary name"   включительно. Подробную информацию о размере
                       библиотечной страницы ищите в Разделе 10.2.5.
Commands  Operations   Символы команд и объектные файлы, сообщающие
                       программе LIB, какие изменения сделать в биб-
                       лиотеке.
listfile  List file    Имя файла перекрестных ссылок. Если вы не за-
                       дадите имя, листинг не будет создан.
newlib  Output library Имя измененной библиотеки, создаваемой в резу-
                       льтате работы утилиты LIB. Если вы не задади-
                       те новое имя библиотеки, оригинальная неизмен-
                       ная библиотека будет записана в библиотечном
                       файле с тем же именем, но расширением .BAK,
                       вместо расширения .LIB.

10.2.2. Стандартная информация для утилиты LIB.

Стандартную входную информацию для утилиты LIB можно выбрать одним из следующих способов:

- Чтобы выбрать стандартную информацию для любой позиции командной строки, опустите имя файла либо имена перед позицией и введите только требуемую запятую. Исключение составляет только параметр Listfile: если вы вместо входной информации введите пятую, программа LIB напротив-создает файл перекрестных ссылок.

- Чтобы выбрать стандарт для любого запроса, нажмите просто ENTER - Чтобы выбрать стандарт для всех оставшихся позиций командной строки, либо для всех оставшихся запросов, введите после данной позиции точку с запятой (;).

В Следующей Таблице описаны значения по умолчанию, используемые утилитой LIB для файла перекрестных ссылок и выходных библиотек:

Файл                   Стандарт


листинг перекрестных   Специальный файл с именем NUL просит утилиту
ссылок                 LINK не создавать файл перекрестных ссылок.
выходная библиотека    Позиция oldlib,либо ответ на запрос "Library
                       name".

10.2.3. Командные символы.

Чтобы сообщить утилите LIB, какие изменения вы хотите сделать с библиотекой, введите командные символы (такие как +, -, -+, *, -*) непосредственно после имени модуля, имени объектного файла, либо имени библиотеки. Задать можно более одного действия, причем в любом порядке. В следующей Таблице приводится список всех командных символов утилиты LIB, тип имени файла, к которому применяется данная операция, и действия, выполняемые по данному командному символу:

Команда                Значение


+{objfile|lib}         При употреблении данного символа с именем объ-
                       ектного файла знак плюс (+) добавляет объект-
                       ный файл к входной библиотеке, причем данный
                       объектный файл становится последним модулем в
                       библиотеке. Для задания имени объектного фай-
                       ла вы можете использовать спецификацию маршру-
                       та. Поскольку утилита LIB автоматически предпо
                       лагает расширение .OBJ, вы можете опустить рас
                       ширение в имени объектного файла. Если знак
                       (+) употребляется с именем библиотеки, содер-
                       жимое данной библиотеки добавляется к входной
                       библиотеке. Имя библиотеки должно иметь расши-
                       рание .LIB.
-module                Удаляет данный модуль из входной библиотеки.
                       Имя модуля не имеет ни имени маршрута, ни рас-
                       ширения имени.
-+module               Заменяет во входной библиотеке данный модуль.
                       Имена модулей не имеют ни наименований маршру-
                       тов, ни расширений. Утилита LIB удаляет данный
                       модуль, затем добавляет объектный файл, имею-
                       щий то же самое, что и модуль, имя. Объектный
                       файл стандартно имеет расширение .OBJ и распо-
                       лагается в текущем рабочем каталоге.
*module                Копирует данный модуль из библиотеки в объект-
                       ный файл в текущем рабочем каталоге. Модуль
                       остается в библиотечном файле. При копировании
                       модуля в объектный файл, утилита LIB добавля-
                       ет расширение .OBJ. Вам нельзя пренебрегать
                       расширением .OBJ, спецификацией дисковода,
                       либо наименованием маршрута для данного объек-
                       тного файла. Однако, позднее вы можете пере-
                       именовать файл, либо скопировать его в любое
                       по вашему желанию место.
-*module               Перемещает данный объектный модуль из библио-
                       теки в объектный файл. Данная операция эквива-
                       лентна копированию модуля в объектный файл,
                       как описано выше, затем происходит удаление
                       модуля из библиотеки.

Предупреждение:

Библиотечные модули могут содержать вызовы других библиотечных модулей. Если вы извлекаете библиотечные модули, которые сами вызы- вают другие библиотечные модули, вызываемые модули не извлекаются.


-Примеры:

    LIB LANG -+HEAP;

Приведенный выше пример использует командный символ замены (-+) для замены с помощью утилиты LIB модуля HEAP в библиотеке LANG.LIB. Утилита LIB удаляет модуль HEAP из библиотеки, затем добавляет объектный файл HEAP.OBJ в качестве нового файла в библиотеку. Точка с запятой в конце командной строки просит программу LIB на оставшиеся запросы использовать стандартные ответы. Это значит, что файл-листинг не будет создан, а данные изменения записываются в оригинальный библиотечный файл, вместо нового библиотечного файла.

    LIB LANG-HEAP+HEAP;
    LIB LANG+HEAP-HEAP;
Приведенный выше пример выполняет ту же самую функцию, что и в первом примере данного раздела, но в две отдельные операции, с помощью командных символов (+)-добавление и (-)-удаление. Действие этих команд будет тем же самым, поскольку операции удаления всегда выполняются до операций добавления, независимо от порядка данных операций в командной строке. Такой порядок выполнения устраняет конфликт при замене старой версии библиотечного файла на новую версию.

    LIB FOR;

В данном примере утилита LIB последовательно выполняет контроль библиотечного файла FOR.LIB. Никаких других действий не происходит. Утилита LIB последовательно высвечивает обнаруженные ошибки и возвращается на уровень операционной системы.

    LIB LANG,LCROSS.PUB

В данном примере утилита LIB последовательно выполняет контроль библиотечного файла LANG.LIB и затем создает файл перекрестных ссылок с именем LCROSS.PUB.

    LIB FIRST -*STUFF *MORE, ,SECOND
В данном примере утилита LIB перемещает модуль STUFF из библиотеки FIRST.LIB в объектный файл с именем STUFF.OBJ. В процессе модуль STUFF удаляется из библиотеки. Модуль MORE копируется из библиотеки в объектный файл с именем MORE.OBJ; модуль остается в библиотеке. Исправленная библиотека получает имя SECOND.LIB. Она содержит все модули из FIRST.LIB, исключая STUFF, который был удален с помощью командного символа (-*). Оригинальная библиотека FIRST.LIB остается неизменной.
    LIBFOR
    +CURSOR+HEAP-HEAP*FOIBLES
    CROSSLST
Содержимое приведенного выше фвйла ответов просит утилиту LIB удалить модуль HEAP из библиотеки LIBFOR.LIB, извлечь модуль FOIBLES и поместить его в объектный файл с именем FOIBLES.OBJ, добавить объектные файлы CURSOR.OBJ и HEAP.OBJ в качестве двух последних модулей в библиотеку. Наконец, утилита LIB создает файл перекрестных ссылок с именем CROSSLST.

10.2.4. Файлы перекрестных ссылок.

Файл перекрестных ссылок содержит следующие два списка: 1. Алфавитный список всех внешних символических имен в библиотеке. За каждым символическим именем следует имя модуля, в котором встретилась ссылка.

2. Список модулей в библиотеке. Под каждым именем модуля находится алфавитный список внешних имен, определенных в данном модуле. -Пример:

Приведенный здесь пример изображает части файла перекрестных ссылок для стандартной библиотеки СИ MLIBCE.LIB. В части, следующей ниже, в первой и третьей колонке даны внешние символические имена из библиотеки, а во второй и четвертой колонке- имена модулей, в которых встречаются ссылки на данные имена:

$$OVDINIT         ovlm61       $i4_m10           ixtomx
$i8_implicit_exp  emfin        $i8_inpbas        emfin
$i8_input         emfin        $i8_input_ws      emfin
$i8_m8            ixtomx       $m4_i10           ixtomx
$m8_i8            ixtomx       DOSCREATECSALIAS  apisim
DOSDEVCONFIG      apisim       DOSFREESEG        apisim
DOSGETMACHINEMODE  apisim      DOSSETVEC         apisim
       .             .              .                .
       .             .              .                .
       .             .              .                .
Во второй части листинга, приведенной далее, за именем каждого модуля из библиотеки следует список внешних имен, встречающихся в каждом модуле:

afhdiff                  Offset:00000010H  Code and data size: 41H
  __aFahdiff
anhdiff                  Offset: 000000d0H Code and data size: 3dH
  __aNahdiff
3_file                   Offset: 00000190H Code and data size: 11aH
  __iob                    __iob2           __lastiob
access                   Offset: 000002f0H Code and data size: 1fH
__access

10.2.5. Установка размера страниц для библиотеки.

Размер страниц библиотеки влияет на выравнивание модулей, хранимых в библиотеке. Модули в библиотеке всегда выравниваются по позиции, кратной размеру страницы (в байтах) от начала файла. Стандартный размер страниц для заново созданной библиотеки 16 байтов.

Установить другой размер страниц для библиотеки во время ее создания, либо изменить размер страниц для существующей библиотеки можно с помощью добавления к командной строке утилиты LIB после пункта oldlib, либо после имени, которое вы введете в ответ на запрос "Library name", следующей опции:

    /P[AGESIZE]:number

Число number определяет новый размер страницы. Оно должно быть целым числом, являющимся степенью двойки в пределах до 16 степени или 32768. Библиотечный размер страницы определяет число модулей, которое может содержать библиотека; то есть, увеличение размера страниц позволяет вам включить в библиотеку больще модулей. Однако, чем больше размер страницы, тем большее количество памяти затрачивается на библиотеку (в среднем, pagesihe/2 байтов на модуль). В большинстве случаев вам следует использовать небольшой размер страницы (если ваша библиотека не является очень большой).

Размер страницы, кроме того, определяет максимальный размер библиотеки. Пределом является число number*65536. Например, если вы зададите /P:16, библиотека должна быть меньше одного мегабайта (16*65536 байтов).

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог