Dcc32 error e2065 unsatisfied forward or external declaration



Dcc32 error e2065 unsatisfied forward or external declaration

Есть модуль на С++ который портировать на Delphi достаточно сложно. Поэтому решил компилировать в обьектник, а потом скомпоновать с основной программой в Delphi. Этот модуль использует некоторые WinApi функции. Для примера есть функция на C++

После компиляции обьектног офайла и подключения его в Delphi. Выскакивают ошибки:

где основной проблемой являеться имплементация системных WinApi функций. Т.к. они прописаны именно в таком виде префикс __imp__ и размер числа параметров @0 и т.п. Например, когда я компилирую какой-нибудь код в Builder C++ то в обьектном файле WinApi функции задекларированы без специфичных префиксов и окончаний. Поэтому, Delphi подцепляет их без проблем и достаточно прописать в uses windows и т.д. и тогда функции сами переопределяться. Или таким способом

но Builder C++ (bcc) и создаёт omf формат. А Visual Studio (cl) coff. Благо Delphi в XE поддерживает этот формат. Но проблемы с окончанием названия функций. Можно было переопределить подобным образом.

Билдер собрать необходимый модуль не может.

Я так понял с++ добавляет в определение WinApi __declspec(dllimport) из-за чего появляются __imp__ и т.д.

Каким образом можно самому обьявить в с++ вызов системных функций, чтобы в обьектный файл не попадали __imp__, @0. Как то статически или можно добавить .def где имена функций будут иметь соответствующий вид. Возможно есть ключ компиляции или какаето pragma. Или может в Delphi как то можно использовать их в таком виде. Возможно есть какие-то ещё варианты?

Источник

Unable to compile in Delphi 10.3 #447

Comments

Danjb1 commented Mar 10, 2019

In Delphi 10.3 Community Edition, trying to compile the RXXPacker project:

Am I missing something here?

The text was updated successfully, but these errors were encountered:

Danjb1 commented Mar 12, 2019

After adding this line to the .inc file, the errors go away:

However, I still get a handful of errors when trying to build the KaM_Remake project itself:

thibmo commented Mar 12, 2019 •

Yeah. Every new release of the compiler will require you to add the version to the list of WDC defines.. 🙂
uPSUtils is part of PascalScript, this is not maintained by the KMR team, the version is only updated some times. (Maybe Rey’s repo has an updated version)

Danjb1 commented Mar 13, 2019

Updated to latest pascalscript, down to just 9 warnings and 4 errors:

I’ll take a closer look, maybe tomorrow. Maybe something else from Rey’s fork will help here.

Kromster80 commented Mar 14, 2019 •

You might want to check the changes in the updated PascalScript and revert back a couple of lines we have manually changed in there for the Remake (e.g. I recall we changed the event from «procedure» to «procedure of object», or something alike — which gives the E2009 error you are having) There was also something to do with strings handling, iirc.

Danjb1 commented Mar 14, 2019

Looking into it now.

PascalScript has been moved a couple of times in the repo but here is the history for reference:

Danjb1 commented Mar 14, 2019

And this commit seems to relate to the string warnings I’m seeing:
5cc861c

Strangely, that line is already present in my version of the file, and the warnings persist nonetheless.

Читайте также:  Xcode select error invalid developer directory applications xcode app contents developer

But hey, it compiles! 🎉 🎈

Thanks for your help.

Footer

© 2023 GitHub, Inc.

You can’t perform that action at this time.

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.

Источник

Связывание sqlite3.obj приводит к ошибкам неудовлетворенных форвардных объявлений

Я скомпилировал ядро ​​базы данных SQLIte3 из sqlite3.c с BCC 55, используя следующую команду:

Создан правильный файл sqlite3.obj. Но как только я пытаюсь связать его в своем приложении Delphi вот так:

Я получаю следующие ошибки:

Зачем нужно реализовывать функции времени выполнения Borland C ++ на чистом паскале (или asm)? Разве те, что связаны в obj напрямую, не могут? Некоторые из них уже реализованы в System.pas, но компилятор жалуется?

Рациональное использование этого mysqlf вместо использования SynSQLite3 или DIXml следующее:

SynSQLite3 поддерживает 3.7.8 (последнюю версию 3.7.9 не вижу)

SynSQLite3 пропускает некоторые объявления, такие как sqlite3_trace, sqlite_open_v2 и т. Д.

SynSQLite2 примерно в 18 раз медленнее, чем DIXml 2.4.0, в последующих 20 шаговых операциях.

DISQLite 2.4.0 быстро выполняет 20000 шагов за 260 мс, но не поддерживает DXE2.

DISQLite 3.0.0 и 3.1.0 действительно поддерживают DXE2, но примерно в 8 раз медленнее, чем 2.4.0

Я очень любопытный парень и всегда стараюсь писать код как можно ближе к металлу.

Престижность разработчикам SynSQLite3 и DISQLite3 — действительно хорошая работа, проделанная до сих пор

В конце концов я выбрал SynSQLite3, потому что:

Это открытый исходный код

Это очень хорошо задокументировано

Я научился сам перекомпилировать sqlite3.obj и оставить только необходимые параметры компиляции для нужных мне функций.

Я могу связать обновленную версию 3.7.9

С тонко настроенной последней версией 3.7.9 obj я достиг скорости DISQLite3.

У парня из DISQLite3 нет даже адреса электронной почты на своем сайте, на который можно было бы писать (просто список рассылки), куда ребята из SynSQLite3 отвечают в SO в тот же час. Это имеет смысл при выборе одной библиотеки вместо другой. Производительность и цена — это еще не все.

PS Мой sqlite3.obj временно доступен для загрузки и тестирования здесь

Линкер. Компилятор не заботится об этом, компоновщик. — OnTheFly

@user нет, это время компиляции, когда создается dcu — David Heffernan

@ Дэвид Хеффернан, неправда. — OnTheFly

@user Не обманывайтесь, думая, что $LINK означает, что файл .obj обрабатывается компоновщиком. Это не так. Он обрабатывается компилятором, и выдается файл .dcu для файла .pas. Попробуйте запустить dcc32 для файла .pas, о котором идет речь, и вы увидите сообщение об ошибке E2065. Компоновщик не запущен, потому что dcc32 в файле .pas создает .dcu, но не связывает. В моей книге компоновщик — это то, что объединяет файлы .dcu для создания исполняемых образов. — David Heffernan

@user На самом деле, в чем разница между компилятором и компоновщиком в цепочке инструментов Delphi? dcc32 компилирует и связывает, насколько я могу судить. Я использую терминологию компиляции для обозначения создания .dcu и связывания для обозначения объединения в исполняемый файл. Что вы имеете в виду под «компоновщиком»? — David Heffernan

2 ответы

Взгляните на наши библиотеки с открытым исходным кодом. Он реализует статическое связывание sqlite3.obj и поддерживается последней версией официального кода SQLite3 (и функций — это единственная структура, позволяющая, например, расширенное использование виртуальных таблиц SQLite3). У вас есть обертка. Но более того.

Читайте также:  Npm install sharp error

Вот как мы компилируем исходный код в .obj (один с FTS3, другой без него):

Тогда взгляните на SynSQLite3.pas Ед. изм. Он содержит некоторую чистую версию паскаль или asm необходимых внешних файлов.

В этом модуле вы найдете гораздо больше, чем просто статическое связывание SQLite3. Обратите внимание, что даже если он используется нашей клиент-серверной средой mORMot ORM, этот ORM является не требуется для использования классов SQLite3. Видеть эта статья для получения дополнительных сведений.

Если вы потерялись в нашем репозитории исходного кода (используя замечательный проект FOSSIL), прочитайте это.

+1 Намного лучше использовать существующий код там, где он подходит. — Дэвид Хеффернан

В конце концов я перекомпилировал сам файл sqlite3.c версии 3.7.9 и заменил файл sqlite3.7.8.obj 3 в SynSQLite3. Это сделало выполнение того же самого, что и версия DISQlite3 2.4.0. Скриншот с профилированием, приложенным к вопросу. — Гад Д Лорд

Поставляемые файлы sqlite3.obj в текущей версии уже находятся в версии 3.7.9. Видеть ссылка, которую я предоставил в конце моего ответа. Прямая загрузка отсюда. Это версия моментального снимка — официальная 1.15 все еще использует 3.7.8. Большое спасибо за ваш интерес к Open Source! Добро пожаловать на наш форум, если вы хотите присоединиться к проекту и внести код для улучшения модуля. — Арно Буше

Довольно забавно видеть, что мой собственный код статической компоновки SQLite3 был повторно использован (конечно, без примечания об авторских правах!) В рамках FireDac библиотека — теперь включена в некоторые версии Delphi! Весь этот приведенный выше код был интегрирован почти как таковой, и даже моя оптимизированная версия QuickSort (). 🙂 Если бы только ссылку на Synopse поставили, как того требуют условия лицензии . 🙁 — Арно Буше

Обновить: Вам будет намного лучше с SynSQLite3.pas как предложил Арно. Однако я оставляю этот ответ здесь, поскольку он иллюстрирует некоторые приемы, которые можно использовать для устранения недостающих зависимостей при статическом связывании.

Здесь происходит то, что файл .obj зависит от различных функций времени выполнения C, которые должны быть предоставлены вами.

Первое, что нужно сделать, это добавить crtl до uses пункт единицы, который содержит $LINK директива. В crtl unit содержит реализации ряда функций библиотеки времени выполнения C и предназначен именно для этой цели.

Однако, когда вы это сделаете, хотя некоторые недостающие зависимости будут устранены, появится гораздо больше.

Многие из них являются просто функциями Windows API, и их можно легко решить, добавив Windows к вашему пункту использования.

На этом этапе у вас остается следующее:

Чтобы решить эту проблему, вам необходимо:

  1. Свяжите другой файл .obj, содержащий отсутствующую зависимость.
  2. Реализуйте отсутствующую зависимость в коде Delphi в том же модуле, который содержит $LINK .

Я не совсем уверен, что делают эти функции, поэтому впереди у вас еще немного работы. Я предполагаю, что эти функции представляют собой 64-битные целочисленные арифметические процедуры. Вы, вероятно, можете перепроектировать это, написав короткие биты C для выполнения различных 64-битных арифметических операций. Затем скомпилируйте с помощью bcc32 и посмотрите на вывод как asm . Предположительно bcc32 имеет способность испускать asm . Или вы можете просто связать с модулем Delphi и посмотреть, какая из вышеперечисленных функций соответствует операциям, которые вы использовали в своем коде C.

Вы можете тянуть localtime из msvcrt.dll , всегда полезный вариант возврата к отсутствующим функциям времени выполнения C. Фактически, это то, что текущая реализация crtl unit, поэтому, если вы собираетесь использовать crtl вы также можете получить localtime так же.

Читайте также:  Ошибка при включении компьютера disk error

Заимствовав некоторый код у Арно, следующий модуль успешно компилируется:

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

Однако по-прежнему отсутствует код для объявления функций sqlite3. Более того, я даже не пытался проверить, работает это или нет. Успешная компиляция — это только первый шаг.

Я настоятельно рекомендую вам использовать код, на который указывает Арно, если вы хотите использовать статическое связывание. Очевидно, что этот код много раз использовался и тестировался, и вы тоже можете извлечь из этого пользу.

Статическое связывание упрощает развертывание, но динамическое связывание с DLL намного проще.

Источник

Dcc32 error e2065 unsatisfied forward or external declaration

процедуру-событие вынести не можно. Но можно написать новую процедуру в новом модуле, и которую ИСПОЛЬЗОВАТЬ в «старой» процедуре-событии.

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

причем, пробовал просто вкладывать текстовый файл с отдельным исходником черех <$I. , и все равно ругается.

там еще в событии разные параметры от компонента приходят

заменить процедуру на класс с передачей ему данных как свойств.
(и как наиболее простой говно-вариант. одно свойство наша форма).

Как продвинутый говно-код класс с обратной связью на
property OnGetData: TNotifyEvent;

разбить супер-процедуру на нужное число более мелких процедур с разными вариантами параметров и вызывать их из события по необходимости.

Источник

динамическое создание сокетов в потоке

Помогите при компиляции, выдает ошибку на строчку.

[DCC Error] mypotok.pas(81): E2009 Incompatible types: ‘method pointer and regular procedure’

Как правильно обработать события от созданных сокетах?

Переделал, но все равно выдает ошибку.

[DCC Error] mypotok.pas(16): E2065 Unsatisfied forward or external declaration: ‘TMyThread.ClientSocketRead’

Приведите пожалуйста пример как правильно.

Расскажите что представляют из себя асинхронный (неблокируемый)/синхронный (блокируемый) сокет.

Расскажите в чем разница использования асинхронный (неблокируемый)/синхронный (блокируемый) сокет.

Почему не правильно использовать асинхронный (неблокируемый) сокет в потоке?

За информацию буду очень благодарен

Переделал, но все равно выдает ошибку.

[DCC Error] mypotok.pas(16): E2065 Unsatisfied forward or external declaration: ‘TMyThread.ClientSocketRead’

Расскажите что представляют из себя асинхронный (неблокируемый)/синхронный (блокируемый) сокет. Расскажите в чем разница использования асинхронный (неблокируемый)/синхронный (блокируемый) сокет. Почему не правильно использовать асинхронный (неблокируемый) сокет в потоке?

Я в программе планирую отправлять/принимать данные на N-е количество компьютеров, через сокеты.
В основном цикле патока должны постоянно формироваться разные данные, для каждого удаленного компьютера, и отправляться через сокеты, причем разные объемы данных, для разных компьютеров.
То есть основной цикл потока будет готовить данные и распихивать порции данных по сокетам, а сокеты будут отправлять и получать данные с удаленных компьютеров.

Надеюсь понятно изложил.

В данном случаи асинхронные сокеты более подойдут?

Источник

Оцените статью
toolgir.ru
Adblock
detector
Этот пользователь сказал Спасибо PhoeniX за это полезное сообщение: