Компоновщик ресурсов RLINK

RLINK комбинирует файл .RES с файлом .EXE для создания нового выполняемого файла Windows. На входе RLINK задаются один или несколько объектных файлов, а на выходе создается один выполняемый файл Windows. RLINK компонует ресурсы, корректируя строковые таблицы и таблицы сообщений и связывая эти скомпонованные ресурсы с выполняемым файлом. Командная строка имеет следующий синтаксис:

Параметр Описание
@<имя_файла> Берет инструкции из указанного файла.
-d Удаляет ресурсы из файла .EXE.
-fe<имя_файла> Переименовывает выходной файл .EXE.
-fi<имя_файла> Переименовывает выходной файл .RES.
-k Не переупорядочивает сегменты для быстрой компоновки.
-v Выводит сообщения о ходе процесса (расширенный листинг).
-vx Перечисляет ресурсы, но не связывает их с файлом .EXE.
-? или -h Выводит справочную информацию о параметрах.
-30 Строит файлы .RES, совместимые с Windows 3.0.
-31 Строит файлы .RES, совместимые с Windows 3.1.

Командный процессор ресурсов: BRC.EXE

Borland Resource Compiler (BRC) - это оболочка компилятора ресурсов. В зависимости от синтаксиса командной строки, она вызывает BRCC или RLINK, либо оба этих продукта. Командная строка BRC имеет следующий синтаксис:


            brc [параметры] <имя_файла>.RC [<имя_файла>.EXE]





Параметры перечислены в следующей таблице:

Параметр Описание
-d<имя>=строка Определяет идентификатор, который вы можете проверить с помощью директивы препроцессора #IFDEF.
-fo<имя_файла> Переименовывает файл .RES.
-fe<имя_файла> Переименовывает файл .EXE.
-fi<имя_файла> Задает дополнительные файлы .RES.
-i<маршрут> Добавляет один или более каталогов к маршруту поиска включаемых файлов.
-k Не переупорядочивает сегменты для быстрой компоновки.
-r Создает только файлы .RES. Скомпилированный файл не добавляется к файлу .EXE.
-v Выводит сообщения о ходе выполнения (расширенный листинг).
-x Указывает компилятору, что нужно игнорировать при поиске включаемых файлов или файлов ресурсов переменную операционной среды INCLUDE.
-31 Строит файлы .RES, совместимые с Windows 3.1.
-w32 Строит файлы .RES, совместимые с Win32.

Использование библиотек

Данный раздел описывает несколько инструментальных средств, которые позволяют вам работать с библиотечными файлами. Вы можете использовать эти инструментальные средства в IDE или в командной строке.

Утилита IMPLIB: библиотекарь импорта

Утилита IMPLIB создает библиотеку импорта, которая может замещать часть или всю секции IMPORTS файла определения модуля для прикладной программы Windows. IDE использует IMPLIB как транслятор для целевого файла DLL. Когда вы добавляете DLL в качестве цели, администратор проектов компилирует и компонует те файлы, от которых зависит DLL, а затем запускает IMPLIB для создания файла .LIB. Вы можете также запустить IMPLIB из IDE.

Библиотеки импорта содержат записи. Каждая запись содержит имя DLL и определяет, где в DLL находятся импортируемые функции. Эти записи связываются с приложением с помощью компоновщика и обеспечивают для Windows информацию, нужную для выполнения вызова функций. Библиотека импорта может указываться в секции IMPORTS файла определения модуля.

Если вы создали приложение Windows, то уже использовали по крайней мере одну библиотеку импорта, IMPORT.LIB, библиотеку для стандартных DLL Windows (она компонуется автоматически). Библиотека импорта перечисляет некоторые или все экспортируемые функции для одной или нескольких DLL. Чтобы создать библиотеку импорта для DLL, наберите:


                IMPLIB параметры имя_библиотеки [файлы_определ... DLL...]





где "параметры" - это необязательный список из одного или более параметров IMPLIB, "имя_библиотеки" - это имя новой библиотеки импорта, "файлы_определ" - это список из одного или более файлов определения модуля для одной или более DLL, а DLL - список существующих DLL. Требуется задать по крайней мере одну DLL или файл определения модуля.

Параметр Описание
Воспринимает идентификаторы с различием регистра символов.
-i Сообщает IMPLIB, что нужно игнорировать WEP (процедуру выхода Windows), необходимую для завершения DLL. Используйте этот параметр, если вы задаете в командной строке несколько DLL.
-w Не выводит предупреждений.

Утилита IMPDEF: администратор файлов определения модуля

Утилита IMPDEF используется с IMPLIB для того, чтобы дать возможность настроить библиотеку импорта для необходимой комплектации заданной прикладной программы. Библиотека импорта используется для предоставления доступа к функциям DLL.

Синтаксис вызова утилиты IMPDEF:


            IMPDEF имя_приемника.DEF имя_источника.DLL





При этом из файла "имя_источника.DLL" создается файл определения модуля с именем "имя_приемника.DEF". Файл определения модуля будет выглядеть следующим образом:


            LIBRARY      имя_файла



            DESCRIPTION  'Описание'



            EXPORTS



                         имя_экспортируемой_функции         @номер



                         ...



                         имя_экспортируемой_функции         @номер





где "имя_файла" является именем корневого файла DLL, 'Описание' является значением утверждения DESCRIPTON, если DLL была предварительно скомпонована с файлом определения модуля, который включает утверждение DESCRIPTION, "имя_экспортируемой_функции" являются именами экспортных функций, а "номера" являются порядковыми значениями (целыми) этих функций.

Классы в DLL

Данная утилита удобна для DLL, использующей классы C++, по двум соображениям. Во-первых, если вы используете ключевое слово _exрort при определении класса, экспортируются все невстроенные функции-элементы и элементы статических данных для этого класса. Удобнее создать файл определения модуля с помощью IMPDEF, так как в нем будут перечислены все экспортируемые функции, включая функции-элементы и элементы статических данных.

Поскольку имена данных функций являются "скорректированными", процесс перечисления всех имен функций в секции EXPORTS файла определения модуля для создания библиотеки импорта из файла определения модуля является очень утомительным. Если для создания файла определения модуля вы используете утилиту IMPDEF, она будет включать порядковое значение для каждой экспортируемой функции, так же как и исходное имя в комментариях, следующих за точкой входа функции, если экспортируемое имя является "скорректированным". Так, например, файл определения модуля, созданный утилитой IMPDEF для DLL, которая использует классы C++, будет выглядеть примерно следующим образом:


             LIBRARY       имя_файла





             DESCRIPTION   'Описание'





             EXPORTS





             скоррект_имя_экпорт_функции  @номер ;  имя_экспорт_функции



               ...



             скоррект_имя_экпорт_функции  @номер ;  имя_экспорт_функции





где "имя_файла" является корневым именем DLL, 'Описание' является значением утверждения DESCRIPTION, если DLL была предварительно скомпонована с файлом определения модулей, который включал ут- верждение DESCRIPTION, "скоррект_имя_экпорт_функции" представляет собой скорректированное имя, "номера" являются порядковыми значе- ниями (целыми) функций, а "имя_экпорт_функции" задает исходное имя функции.

Функции в DLL

Утилита IMPDEF создает редактируемый исходный файл, который перечисляет все экспортные функции в DLL. Вы можете отредактировать этот файл .DEF так, чтобы он содержал только те функции, которые вы хотите сделать доступными для нужной прикладной программы, а затем выполнить IMPLIB для отредактированного файла .DEF. В результате получается библиотека импорта, которая содержит информацию импорта для заданного подмножества экспортируемых функций DLL.

Например, пусть вы определяете DLL, которая предоставляет функции для использования различными прикладными программами. Каждая экспортируемая функция в DLL определяется с помощью оператора _exрort. Теперь, если все прикладные программы используют все экспортируемые функции DLL, вы можете просто использовать IMPLIB для создания одной библиотеки импорта для DLL и поставлять эту библиотеку импорта с DLL. Библиотека импорта может быть скомпонована с любыми прикладными программами, исключая таким образом необходимость перечисления для каждой прикладной программы каждой используемой ей функции DLL в секции IMPORT файла определения модуля.

Теперь, пусть нужно передать некоторую часть экспортируемых функций DLL отдельной прикладной программе. В идеале требуется скомпоновать специальную библиотеку импорта с этой прикладной программой - библиотеку импорта, которая предоставляет только подмножество функций, которые будут использоваться прикладной программой. Все другие экспортируемые функции в DLL для клиентной прикладной программы должны быть скрыты.

Для создания библиотеки импорта, которая удовлетворяет этим условиям, выполните IMPDEF для откомпилированной и скомпонованной DLL. Утилита IMPDEF создаст файл определения модуля, который содержит в секции EXPORT перечисление всех экспортируемых функций DLL. Вы можете редактировать этот файл определения модуля, удаляя компоненты секции EXPORTS для тех функций, которые вы не хотите включать в библиотеку импорта. После того, как вы удалите ненужные экспортируемые функции, выполните утилиту IMPLIB для файла определения модуля. Результатом будет библиотека импорта, которая содержит информацию импорта только для экспортных функций, перечисленных в секции EXPORTS файла определения модуля.

Утилита TLIB: турбо библиотекарь

Включенная в пакет Borland С++ утилита TLIB осуществляет управление библиотеками, состоящими из отдельных файлов с расширением .OBJ (объектных модулей). Библиотека представляет собой удобное средство для работы с совокупностью объектных модулей, рассматриваемых как единое целое.

Библиотеки, включенные в систему Borland C++, были созданы с помощью программы TLIB. Утилитой TLIB можно пользоваться для создания своих собственных библиотек или для модификации стандартных библиотек системы Borland C++, своих собственных библиотек, библиотек, которые были созданы другими программистами, или приобретенных вами коммерческих библиотек. Утилиту TLIB можно использовать для того, чтобы:

Когда утилита TLIB осуществляет модификацию существующей библиотеки, она всегда создает копию оригинальной библиотеки с расширением .BAK. При модификации существующей библиотеки TLIB всегда создает копию исходной библиотеки с расширением .BAK. Это делается для вашего удобства.

Утилита TLIB может также создавать (и включать в файл библиотеки) расширенный словарь, который может использоваться для ускорения процесса компоновки. Хотя утилита TLIB не обязательна для создания выполняемых программ при работе с Borland C++, она представляет собой полезный инструмент повышения производительности труда программиста. Вы обнаружите, что утилита TLIB незаменима при создании больших проектов. Если вы работаете с библиотеками объектных модулей, созданных другими лицами, то при необходимости вы можете использовать TLIB для их сопровождения.

Почему следует использовать библиотеки объектных модулей

Программируя на языке Cи и С++, вы часто создаете совокупность полезных функций Си, аналогичных функциям из библиотеки поддержки. Благодаря модульности Си и С++, вы вероятнее всего разобьете эти функции на множество отдельно компилируемых исходных файлов. В любой конкретной программе из всей совокупности этих функций вы будете использовать лишь некоторое их подмножество. Однако, явное указание каждый раз именно тех файлов, которые необходимо использовать, является весьма утомительным занятием. С другой стороны, если вы всегда включаете в результирующий файл все исходные модули, то ваша программа становится очень большой и громоздкой.

Библиотеки объектных модулей разрешают проблему управления совокупностью функций, написанных на языке Си. Когда вы компонуете вашу программу с библиотекой, компоновщик просматривает содержимое библиотеки и автоматически выбирает только те модули, которые требуются для создания текущей программы.

Командная строка утилиты TLIB

Командная строка утилиты TLIB имеет общий вид, приведенный ниже, где заключенные в квадратные скобки элементы являются необязательными:


           tlib [@файл_подсказки] [параметры] имя_библиотеки



                  [операции] [, файл_списка]





Чтобы получить информацию об использовании TLIB, просто наберите команду TLIB и нажмите клавишу Enter.

В IDE вы можете задать библиотеку в качестве целевого файла проекта. С помощью TargetExpert выберите для целевого типа Static Library. TLIB - это используемый по умолчанию для библиотечного файла транслятор. Он использует параметры, заданные в диалоговом окне Project Options секции Librarian (выберите в основном меню Options Project).

Параметр Описание
@файл_подсказки Маршрут и имя файла подсказки, содержащего параметры библиотекаря. Можно указать несколько таких файлов.
@имя_библиотеки Имя маршрута DOS библиотеки, с которой вы работаете. Она должна указываться в каждой команде TLIB. Трафаретные символы не допускаются. По умолчанию используется расширение .LIB.
/C Параметр различимости регистра.
/E Создает расширенный словарь.
/Pразмер Задает размер страницы библиотеки.
/O Удаляет из библиотеки комментарии.
операции Список выполняемых TLIB операций. Операции могут следовать в любом порядке. Если вы хотите только просмотреть содержимое библиотеки, не задавайте никаких операций.
файл_списка Имя файла, в который будет выводиться перечень содержимого библиотеки. Если имя файла "файл_списка" задается, то ему должна предшествовать запятая. Если имя этого файла не задается, то перечень не создается. Перечень представляет собой список всех модулей, упорядоченных по алфавиту. Запись для каждого модуля содержит упорядоченный по алфавиту список всех общедоступных идентификаторов, описанных в этом модуле. По умолчанию для файла "файл_списка" используется расширение имени .LST. Вы можете назначить вывод списка на экран, задавая в качестве имени "файла_списка" имя CON, или на принтер, задавая в качестве имени "файла_списка" имя PRN.

Использование файлов подсказки

При работе с большим числом операций или при многократном повторении определенного числа операций удобно пользоваться файлами подсказки. Файл подсказки представляет собой текстовый файл в обычном формате ASCII (который может быть создан с помощью редактора системы Borland C++), содержащий все команды утилиты TLIB или какую-то их часть. С помощью файлов подсказки вы можете создавать команды утилиты TLIB, размер которых превышает размер командной строки DOS (128 символов).

Для использования файла подсказки "имя_маршрута", в любой позиции командной строки утилиты TLIB нужно задать @"имя_маршрута".

Создание расширенного словаря: параметр /E

Для ускорения процесса компоновки больших файлов библиотек (таких, как стандартная библиотека Cx.LIB), можно указать утилите TLIB, что нужно создать расширенный словарь и подсоединить его к файлу библиотеки. Данный словарь в крайне компактной форме содержит информацию, которая не вносится в стандартный словарь библиотеки. Эта информация позволяет компоновщику TLINK быстрее обрабатывать файлы библиотек, особенно в том случае, когда они находятся на гибком диске или на медленном жестком диске. Все библиотеки на ваших дистрибутивных дисках содержат расширенный словарь.

Для создания расширенного словаря модифицируемой библиотеки необходимо при добавлении, удалении или замене модулей в этой библиотеке задать параметр /E при вызове утилиты TLIB. Для создания расширенного словаря существующей библиотеки, которую вы не хотите модифицировать, нужно задать параметр /E и указать TLIB удаление из библиотеки несуществующего модуля. При этом утилита TLIB выдаст предупреждающее сообщение о том, что заданный модуль в библиотеке не найден, но наряду с этим создаст расширенный словарь заданной библиотеки. Например, введите следующую строку:


            tlib /E mylib -bogus





Если не использовать в командной строке TLIB параметр /e, то утилита TLIB будет игнорировать отладочную информацию в библиотеке, имеющей расширенный словарь.

Задание размера страницы: параметр /P

Каждый библиотечный файл в системе DOS содержит в себе словарь (располагающийся в конце .LIB файла, после объектных модулей). Для каждого модуля в библиотеке данный словарь содержит 16-битовый адрес этого конкретного модуля внутри файла .LIB; адрес задается в единицах, равных размеру страницы библиотеки (по умолчанию, этот размер равен 16 байтам).

Размер страницы библиотеки определяет максимальный совокупный размер всех объектных модулей в библиотеке - библиотека не может превышать 65536 страниц. Стандартный (и минимальный) размер страницы, равный 16 байтам, позволяет создавать библиотеки размером до 1 Мбайт (приблизительно). Для того, чтобы создать библиотеку большего размера, необходимо увеличить размер страницы с помощью параметра /P; размер страницы должен являться степенью двойки; он не может быть меньше 16 байт и не может превышать 32768 байт.

Все модули в библиотеке должны начинаться с границы страницы. Например, в библиотеке с размером страницы 32 (минимально возможный размер страницы который больше стандартного значения 16), в результате создания "зазоров" на каждом объектном модуле будет теряться в среднем 16 байт. Если вы пытаетесь создать библиотеку, которая слишком велика для заданного размера страницы, утилита TLIB выдаст сообщение об ошибке и предложит вам воспользоваться параметром /P, задав следующее, большее значение размера страницы.

Различимость регистра символов в идентификаторе: параметр /C

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

Обычно когда утилита TLIB проверяет библиотеку на наличие дублируемых идентификаторов, буквы верхнего и нижнего регистров обычно не различаются. Например, идентификаторы lookuр и LOOKUP будут восприниматься как дубликаты. Так как Си обрабатывает буквы верхнего и нижнего регистров как различным образом, для добавления в библиотеку модуля, содержащего идентификатор, отличающийся от другого, уже имеющегося в библиотеке идентификатора, только регистром букв, нужно пользоваться параметром /C. Параметр /C указывает утилите TLIB, что нужно считать допустимыми модули, в которых идентификаторы отличаются от уже имеющихся в библиотеке только регистром букв.

Если вы хотите использовать эту библиотеку с другими компоновщиками (или позволить другим лицам использовать эту библиотеку с другими компоновщиками), то во избежание "неприятностей", параметр /C использовать не рекомендуется.

Удаление записей-комментариев: параметр /O

Параметр /O указывает библиотекарю, что из библиотеки нужно удалить все записи комментария "Comment". Записи комментария применяются обычно для хранения информации, используемой отладчиком или другими инструментальными средствами, и не требуются для создания выполняемого файла. Использование данного параметра позволит уменьшить объем ваших библиотек (и создаваемых с их использованием программ).

Список операций

Список операций определяет, какие действия должна выполнять утилита TLIB. Он состоит из последовательности заданных одна за другой операций. Каждая операция состоит из одно- или двухсимвольного обозначения операции, за которым следует имя файла или имя модуля. Пробельные символы могут окружать либо обозначение операции, либо имя файла или модуля, но их нельзя использовать в середине двухсимвольного обозначения операции или внутри имени.

В командной строке можно указывать любое число операций но суммарная длина строки не должна превышать предел в 127 символов, установленный в DOS (в COMMAND.COM). Порядок следования операций не имеет значения. Утилита TLIB всегда выполняет операции в следующем порядке:

  1. Сначала выполняются все операции извлечения.
  2. Затем выполняются все операции удаления.
  3. И, наконец, выполняются все операции добавления.

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

Утилита TLIB распознает три символа действия (-, + и *), которые могут использоваться самостоятельно или объединенными в пары, образуя в совокупности пять различных операций. Для тех операций, в которых используются пары символов, порядок расположения символов не играет роли. Обозначения операций и выполняемые этими операциями действия указаны ниже (для создания библиотеки, добавьте модули к библиотеке, которая еще не существует):
Символ Имя Описание действия
+ Добавление Утилита TLIB добавляет заданный файл в библиотеку. Если расширение имени файла не задается, то подразумевается расширение .OBJ. Если сам файл является библиотекой (с расширением .LIB), то в результате выполнения операции все модули указанной библиотеки будут добавлены в полученную в результате библиотеку. Если добавляемый модуль уже существует, то TLIB отображает сообщение, но не добавляет новый модуль.
- Удаление Утилита TLIB удаляет заданный модуль из библиотеки. Если этот модуль в библиотеке не существует, то TLIB отображает сообщение. Операция удаления требует задания только имени модуля. TLIB допускает ввод полного имени маршрута с указанием имени дисковода и расширения, но игнорирует все, за исключением имени модуля.
* Извлечение Утилита TLIB создает заданный файл путем копирования соответствующего модуля из библиотеки в файл. Если этот модуль не существует, то TLIB отображает сообщение, но файла не создает. Если файл с заданным именем уже существует, то он затирается, а на его место записывается новый.
-*
*-
Извлечение и удаление Утилита TLIB копирует заданный модуль в файл с соответствующим именем, а затем удаляет его из библиотеки. Данная операция представляет собой сокращенный путь для последовательного выполнения операции извлечения с последующей операцией удаления.
-+
+-
Замена Утилита TLIB заменяет заданный модуль на соответствующий файл. Данная операция представляет собой сокращенный путь для последовательного выполнения операции удаления с последующей операцией добавления.

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

Примеры

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

  1. Чтобы создать библиотеку с именем MYLIB.LIB, в которую должны входить модули X.OBJ, Y.OBJ и Z.OBJ, введите:
    
                   tlib mylib +x +y +z
    
    
    
    
    
    
  2. Чтобы создать библиотеку как в примере #1, но наряду с этим получить файл списка MYLIB.LST, введите:
    
                   tlib mylib +x +y +z, mylib.lst
    
    
    
    
    
    
  3. Чтобы получить файл списка CS.LST существующей библиотеки CS.LIB, введите:
    
                   tlib cs, cs.lst
    
    
    
    
    
    
  4. Чтобы заменить модуль X.OBJ на новую версию, добавить модуль A.OBJ и удалить модуль Z.OBJ из библиотеки MYLIB.LIB, введите:
    
                   tlib mylib -+x +a -z
    
    
    
    
    
    
  5. Чтобы извлечь модуль Y.OBJ из библиотеки MYLIB.LIB и получить файл списка MYLIB.LST, введите:
    
                   tlib mylib *y, mylib.lst
    
    
    
    
    
    
  6. Чтобы создать при помощи файла подсказки новый файл библиотеки с именем ALPHA, в который войдут модули A.OBJ, B.OBJ,... , G.OBJ: Сначала создайте текстовый файл ALPHA.RSP, содержащий строки:
    
                   +a.obj +b.obj +c.obj &
    
    
    
                       +d.obj +e.obj +f.obj &
    
    
    
                       +q.obj
    
    
    
    
    
    
    Затем введите команду TLIB, которая создает файл списка ALPHA.LST:
    
                   tlib alрha @alрha.rsр, alрha.lst
    
    
    
    

Назад | Содержание | Вперед