Какие файлы.OBJ связаны с какими библиотеками VCL
При связывании проекта C++ в Embarcadero RAD Studio XE3 (с отключенным параметром "Использовать пакеты времени выполнения") иногда возникает ошибка в виде:
[ilink32 Error] Fatal: Unable to open file 'FOO.OBJ'
Я понимаю, что вызывает это. Это потому, что в коде есть неявная ссылка (обычно через #pragma link
), что заставляет компоновщик требовать блок FOO
,
И если я посмотрю в источнике VCL, я обычно могу найти FOO.PAS
который собирается в FOO.DCU
, Это скомпилированный модуль, который ищет компоновщик, но не может его найти.
Я знаю, что этот скомпилированный модуль находится в одной из библиотек VCL, но я не знаю, как узнать, какая именно. Например, какие модули содержат VCL.LIB и RTL.LIB и BCBIE.LIB (и т. Д.)?
Учитывая имя модуля, я хотел бы знать, какая библиотека VCL содержит его. Если бы я знал это, я мог бы просто добавить соответствующий файл.lib в LinkPackageStatics
тег в моем файле cbproj, и все будет просто ссылка.
Было бы неплохо, если бы это было просто показано в документации к этому устройству, но его там нет. В настоящее время я должен использовать метод проб и ошибок, чтобы найти нужную библиотеку, но, безусловно, где-то есть общедоступный список, который показывает, какие модули VCL связаны с какими библиотеками VCL.
Где я могу найти такой список?
(Между прочим, я знаю, что при обычном использовании IDE разработчик не обязан это знать. IDE обычно заботится об этом за вас. Но я нахожу, что иногда мне нужна эта информация, когда.cbproj неправильно объединяется. или отредактировано вручную или по ряду других причин, выходящих за рамки обычного использования IDE.)
РЕДАКТИРОВАТЬ: Спасибо! Тлиб был именно то, что мне было нужно. Я довольно отвратительный в сценариях оболочки, но я написал небольшой сценарий оболочки, который выводит имя библиотеки рядом с именем каждого из модулей, которые она содержит:
#!/bin/bash
while [ "$1" != "" ]; do
name=$(basename "$1")
tlib /L $name | grep size | awk -v name=$name '{print name, "\t", $1}'
shift
done
Затем я могу вызвать скрипт, выполнив его на всех.libs, которые меня интересуют, и затем выбрав модуль (например, SysUtils), который я ищу:
find . -name "*.lib" -exec libunits.sh {} \; | grep SysUtils
1 ответ
Вы можете использовать tlib.exe, например:
tlib /l vcl.lib
Другой вариант - перечислить ресурс 'PACKAGEINFO' в BPL, используя GetPackageInfo, как показано в этом ответе.