Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Разное
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 13.03.2025, 20:57
BorisUB BorisUB вне форума
Прохожий
 
Регистрация: 04.01.2025
Сообщения: 4
Версия Delphi: Delphi 12
Репутация: 10
Вопрос Как в DELPHI проект подключить функции на языке Си?

По заголовку темы вопрос покажется "баяном", но меня интересуют нюансы, с которыми я долго пытался разобраться сам, привлекал в помощники 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  
Старый 14.03.2025, 10:02
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,084
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

конечно есть другой вариант.
но тут придется помучиться.

Во первых, про 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  
Старый 14.03.2025, 20:41
BorisUB BorisUB вне форума
Прохожий
 
Регистрация: 04.01.2025
Сообщения: 4
Версия Delphi: Delphi 12
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Возможно, я просто не помню, C++ Builder может скомпилировать исходник в .dcu
Посмотрю, но я копал в этом направлении, скорее всего не может.
Цитата:
Сообщение от lmikle
Теперь по поводу другого пути. Возможно напрямую подключать функции из .obj файлов
Это у меня как то совсем легко получилось, но за поворотом поджидала большая засада. Функция на Си должна быть "самодостаточной", т.е. не обращаться к другим функциям библиотек Си. Тогда проект соберётся и функция действительно станет частью EXEшника.
Но достаточно использовать конструкцию вида #include <match.h>
y = sin(x); как вся идиллия идёт прахом! DELPHI тут же выдаст ошибку, что функция sin ему неизвестна. И, если вникнуть в матчасть, он прав! Ведь скомпилированный obj сам не умеет вычислять синус, он лишь содержит ссылку на библиотеку math.lib, которая будет связана с нужным кодом только в процессе линковки.
Ответить с цитированием
  #4  
Старый 14.03.2025, 21:40
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,084
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Если ты внимательно почитаешь вторую статью, то там есть пример, как поправить это. Априанты:
- прилинковать соотв. obj файлы (если правильно помню, то даже не обязательно декларировать функции)
- создать свои реальзации для подобных функций. В статье дается пример для malloc.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
BorisUB (15.03.2025)
  #5  
Старый 15.03.2025, 19:23
BorisUB BorisUB вне форума
Прохожий
 
Регистрация: 04.01.2025
Сообщения: 4
Версия Delphi: Delphi 12
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
- прилинковать соотв. obj файлы
Только где их взять? Писать собственные реализации, ну смотря каких функций. Упомянутый мной SIN - ещё куда ни шло, можно и написать. Классика, лабораторка по программированию для студента. А если таких и более сложных функций несколько десятков? Ещё можно "выдрать" нужные готовые obj из lib с помощью неких сторонних утилит, натыкался на подобную тему. Но да ну его при таком раскладе! Всё действительно становится слишком сложно. Проще плюнуть на капризы и с использованием dll смириться.

P.S. В LAZARUS (Free Pascal) есть директива компилятора {$LinkLib 'your_static_library'}, позволяющая решить проблему без плясок с бубном, впрочем я лично не пробовал с ней играться. Но в DELPHI её точно нет

Думаю, можно считать тему закрытой. Я просто хотел убедиться, что действительно перепробовал всё возможное и других вариантов нет, т.к. являюсь новичком в DELPHI и запросто могу не знать очевидного.
Ответить с цитированием
  #6  
Старый 16.03.2025, 07:51
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,084
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну тут все зависит от конкретной ситуации.
Есть еще вариант добавить dll в ресурсы исполняемого файла и во время выполнения выгружать ее на диск или в память. См тут: https://wastedump.wordpress.com/2010...ing-in-delphi/

Последний раз редактировалось lmikle, 16.03.2025 в 19:32.
Ответить с цитированием
  #7  
Старый 17.03.2025, 08:20
Аватар для Verevkin
Verevkin Verevkin вне форума
Прохожий
 
Регистрация: 22.06.2015
Сообщения: 45
Версия Delphi: 3...XE12
Репутация: -50
По умолчанию

Про какую-такую функцию мы тут говорим? А ну покаж.
__________________
Хей-хей-хей! Только не ходите в мой сарай, лады?..
Ответить с цитированием
  #8  
Старый 17.03.2025, 08:38
BorisUB BorisUB вне форума
Прохожий
 
Регистрация: 04.01.2025
Сообщения: 4
Версия Delphi: Delphi 12
Репутация: 10
По умолчанию

Цитата:
Сообщение от Verevkin
Про какую-такую функцию мы тут говорим? А ну покаж.
Если совсем конкретно, то вот про эту: https://github.com/codeplea/tinyexpr
Готового парсера математических выражений на Паскале я так и не нашел, они либо платные, либо крайне примитивные. В DLL я его компилировал на С++builder, всё замечательно подключается к DELPHI и работает. Из всего пакета мне нужна лишь одна функция, которая принимает строковое выражение и возвращает вычисленный результат. Хотелось бы её влинковать в экзешник.
Ответить с цитированием
  #9  
Старый 17.03.2025, 18:43
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,084
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Не нашел говоришь...
Вот 5 мин поиска:
https://torry.net/components/science...ons/artformula
https://torry.net/components/science...ssions/foreval

Плюс точно есть парсеры того же паскаля.
Плюс можно выполнить JavaScript (если правильно помню, то там просто webBrawser бросаешь на форму и ему скрипты скармливаешь).
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:03.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025