Можно ли создать проект EXE на основе BPL/DCP с непроверенным параметром "Сборка с помощью пакетов времени выполнения", основываясь исключительно на BPL/DCP?

У меня есть проект BPL (с некоторыми базовыми компонентами) и проект EXE, который имеет в своем пути поиска расположение вывода другого проекта (BPL и DCP). Когда проект EXE создается с помощью "Build With Runtime Packages", он собирается нормально. Тем не менее, это требует от меня, чтобы развернуть EXE и BPL. Все идет нормально.

Поскольку я предпочел бы развернуть только EXE (не важно, будет ли он больше), я бы предпочел, чтобы я просто снял флажок "Build With Runtime Packages" и это было бы так, но это не так. Это не будет строить, и начать жаловаться на отсутствующие классы. Единственный способ, которым я могу скомпилировать проект EXE, - это добавить путь к DCU реального проекта BPL в путь поиска проекта EXE. Я могу это сделать, но почему я вынужден указывать на DCU? Разве Delphi не может просто взять их из BPL? Это не просто вопрос вкуса, если я пойду таким образом и сошлюсь на DCU, когда дело доходит до DCU, принадлежащих к формам, тогда он попросит у меня DFM для форм, заставив меня также включить папку с исходными файлами в EXE путь поиска проекта, и теперь кажется, что они компилируются, что является запретительным. Я не могу перекомпилировать свою кодовую базу BPL-проекта каждый раз, когда хочу скомпилировать свой EXE-проект.

Я надеюсь, что я ясно дал понять.

Любая помощь о том, как добиться того, что просят в названии, приветствуется.

Спасибо.

3 ответа

Решение

Нет, ты не можешь. Если вы хотите использовать исполняемые пакеты, вы должны включить опцию компилятора для сборки с исполняемыми пакетами.

Что касается второй части вашего вопроса: Сборка с использованием пакетов времени выполнения для компиляции использует файлы *.dcp (потоки.dfm связаны с ресурсами пакетов, поэтому файлы *.dfm напрямую не нужны). Для сборки без исполняемых пакетов нужны файлы *.dcu и *.dfm (и любые другие необходимые файлы).

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

Существует два способа связать внешние библиотеки: статический и динамический.

Когда вы используете пакеты времени выполнения, это динамическое связывание. Фактическая реализация в BPL файл (который на самом деле является простой DLL), методы и классы импортируются из него при запуске процесса. Это уменьшает exe размер, но требует BPL файл, который будет отправлен (такой же, как обычный dll). DCU файлы не нужны, потому что все уже скомпилировано и скомпоновано, компоновщик нужен только для создания раздела импорта.

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

Поэтому ответ на ваш вопрос заголовок прост - нет, это не возможно.

Это возможно, но очень сложно реализовать. И для этого вам нужно будет создать третий проект - загрузчик. Вам нужно превратить ваш оригинальный EXE-проект в DLL-библиотеку, созданную из пакетов времени выполнения. Загрузчик может включать ваш проект DLL, rtl.bpl, vlc.bpl и ваш проект BPL в качестве ресурсов внутри исполняемого файла загрузчика. Загрузчик должен будет вручную сделать все, что сделано LoadLibrary Windows API.

Вы можете прочитать больше о том, как загрузить DLL из памяти и найти примеры кода, с которых можно начать, здесь.

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