![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() По заголовку темы вопрос покажется "баяном", но меня интересуют нюансы, с которыми я долго пытался разобраться сам, привлекал в помощники ChatGPT, но воз и ныне там.
Самое простое решение я знаю и оно прекрасно работает. Из исходников на Си создать классическую DLL библиотеку и вызывать находящиеся в ней функции по мере надобности как внешние. Но вот имеется у меня некий каприз, я хочу собрать свой крошечный немудрёный проект на DELPHI в единый exe файл и чтоб никаких DLL в нагрузку не болталось. Пытался создавать библиотеку в виде статической LIB, но как её подключить к DELPHI? (к LAZARUS вроде можно, но это другая песня). RAD studio предлагает собственный формат - удобную и расширенную альтернативу DLL под названием BPL. При этом BPL можно создавать как в DELPHI, так и в C++ builder и, казалось бы - вот он, тот самый инструмент! Но на практике я так и не смог созданную в C++ builder BPL использовать в DELPHI в качестве статической библиотеки, которую можно прилинковать к exe. Собственно вопрос, я что то не знаю и не так делаю или же в пустую бьюсь башкой о каменную стену, ибо кроме способа с использованием DLL другого варианта попросту нет? А BPL, созданная в C++ builder - это совсем не та BPL, которую можно создать в DELPHI? |
#2
|
|||
|
|||
![]() конечно есть другой вариант.
но тут придется помучиться. Во первых, про BPL. Это не совсем то, что ты думаешь. BPL это, фактически, замена DLL, но с определенными нюансами (в основном, связанные с тем, что, в отличии от DLL, в BPL сохраняется объектный контекст). Так что BPL тут тебе не поможет, т.к. исходники у иебя все равно плюсовые. Возможно, я просто не помню, C++ Builder может скомпилировать исходник в .dcu, тогда можно попробовать подключать уже скомпилированные модули как библиотеки. Теперь по поводу другого пути. Возможно напрямую подключать функции из .obj файлов (т.е. оезультата компиляции из исходников C) в код. Для начала - вот статья: https://docwiki.embarcadero.com/RADS...t_file_(Delphi) Теперь статья с подробным объяснением: http://rvelthuis.de/articles/articles-cobjs.html |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
BorisUB (14.03.2025)
|
#3
|
|||
|
|||
![]() Цитата:
Цитата:
Но достаточно использовать конструкцию вида #include <match.h> y = sin(x); как вся идиллия идёт прахом! DELPHI тут же выдаст ошибку, что функция sin ему неизвестна. И, если вникнуть в матчасть, он прав! Ведь скомпилированный obj сам не умеет вычислять синус, он лишь содержит ссылку на библиотеку math.lib, которая будет связана с нужным кодом только в процессе линковки. |
#4
|
|||
|
|||
![]() Если ты внимательно почитаешь вторую статью, то там есть пример, как поправить это. Априанты:
- прилинковать соотв. obj файлы (если правильно помню, то даже не обязательно декларировать функции) - создать свои реальзации для подобных функций. В статье дается пример для malloc. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
BorisUB (15.03.2025)
|
#5
|
|||
|
|||
![]() Цитата:
P.S. В LAZARUS (Free Pascal) есть директива компилятора {$LinkLib 'your_static_library'}, позволяющая решить проблему без плясок с бубном, впрочем я лично не пробовал с ней играться. Но в DELPHI её точно нет ![]() Думаю, можно считать тему закрытой. Я просто хотел убедиться, что действительно перепробовал всё возможное и других вариантов нет, т.к. являюсь новичком в DELPHI и запросто могу не знать очевидного. |
#6
|
|||
|
|||
![]() Ну тут все зависит от конкретной ситуации.
Есть еще вариант добавить dll в ресурсы исполняемого файла и во время выполнения выгружать ее на диск или в память. См тут: https://wastedump.wordpress.com/2010...ing-in-delphi/ Последний раз редактировалось lmikle, 16.03.2025 в 19:32. |
#7
|
||||
|
||||
![]() Про какую-такую функцию мы тут говорим? А ну покаж.
Хей-хей-хей! Только не ходите в мой сарай, лады?.. |
#8
|
|||
|
|||
![]() Цитата:
Готового парсера математических выражений на Паскале я так и не нашел, они либо платные, либо крайне примитивные. В DLL я его компилировал на С++builder, всё замечательно подключается к DELPHI и работает. Из всего пакета мне нужна лишь одна функция, которая принимает строковое выражение и возвращает вычисленный результат. Хотелось бы её влинковать в экзешник. |
#9
|
|||
|
|||
![]() Не нашел говоришь...
Вот 5 мин поиска: https://torry.net/components/science...ons/artformula https://torry.net/components/science...ssions/foreval Плюс точно есть парсеры того же паскаля. Плюс можно выполнить JavaScript (если правильно помню, то там просто webBrawser бросаешь на форму и ему скрипты скармливаешь). |