Предыстория.
Среда - С++ Builder XE4.
Визуальный фреймворк - FireMonkey3.
Есть группа проектов, несколько дллей, рантайм-пакеты, и исполняемый файл, который это все хозяйство использует.
Проблема.
- Проект исполняемого файла не линкует к себе мои локальные рантайм-пакеты
- Если принудительно включить bpi файлы моих пакетов в проект, они линкуются всегда динамически, даже если снять в опциях проекта флажок "Link with Runtime packages"
Решение.
Открываем проект исполняемого файла в текстовом редакторе.
Находим ближе к началу файла базовую группу опций:
<PropertyGroup Condition="'$(Base)'!=''">
....
</PropertyGroup>
Туда менеджер проектов IDE запихивает список библиотек экспорта пакетов (lib), необходимых и достаточных для статической линковки проекта.
Называется это свойство: AllPackageLibs
Когда мы переключаемся между статической/динамической линковкой пакетов в проекте, менеджер IDE добавляет в соответствующие конфигурационные группы список из библиотек статической линковки (lib), или динамической (bpi) линковки пакетов. Названия файлов берутся менеджером из базового поля, затем соответственно флагу подменяются расширения lib на dll.
В принципе, даже когда в опциях конечного проекта приложения мы добавляем bpi наших пакетов в список runtime packages, менеджер проектов не "соображает", что наш конечный проект зависит от экспорта этих пакетов, если только их объекты не вставляются в формы через визуальные механизмы. В моем случае, пакеты исключительно ран-таймового типа, все объекты используются только программно.
Таким образом, мы должны либо добавить вручную наши пакеты (с расширениями lib) к базовому списку AllPackageLibs, если он уже есть в нашем проекте. Или заводим такой список сами, автоматический менеджер будет дописывать туда свои части, если надо.
Последнее, что необходимо учесть - при статической линковке наших пакетов, если они содержат формы, визуально наследуемые в проекте, надо добавлять путь к файлам fmx этих форм в дополнительные опции линкера, например: Project Options->C++ Linker (All Configurations|All Platforms) ->Advanced->Advanced Options: -J<fmx file paths>.