Какие файлы.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, как показано в этом ответе.

Другие вопросы по тегам