Предыстория.

Среда - С++ Builder XE4.

Визуальный фреймворк - FireMonkey3.

Есть группа проектов, несколько дллей, рантайм-пакеты, и исполняемый файл, который это все хозяйство использует.

Проблема.

  1. Проект исполняемого файла не линкует к себе мои локальные рантайм-пакеты
  2. Если принудительно включить 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>.