Обновление : вам будет гораздо лучше с SynSQLite3.pas
, как это предложил Арно. Однако я оставляю здесь этот ответ, поскольку он иллюстрирует некоторые приемы, которые можно использовать для устранения недостающих зависимостей при статическом связывании.
То, что здесь происходит, заключается в том, что файл .obj зависит от различных функций среды выполнения C, которые должны быть предоставлены вами.
Первое, что нужно сделать, это добавить crtl
к предложению uses
модуля, который содержит директиву $LINK
. Модуль crtl
содержит реализации ряда функций библиотеки времени выполнения C. Он предназначен именно для этой цели.
Однако, когда вы делаете это, хотя некоторые отсутствующие зависимости разрешаются, появляется гораздо больше.
Unsatisfied forward or external declaration: '_lldiv'
Unsatisfied forward or external declaration: '_llmod'
Unsatisfied forward or external declaration: 'localtime'
Unsatisfied forward or external declaration: '_llmul'
Unsatisfied forward or external declaration: 'InterlockedCompareExchange'
Unsatisfied forward or external declaration: 'InitializeCriticalSection'
Unsatisfied forward or external declaration: 'Sleep'
Unsatisfied forward or external declaration: 'DeleteCriticalSection'
Unsatisfied forward or external declaration: 'EnterCriticalSection'
Unsatisfied forward or external declaration: 'LeaveCriticalSection'
Unsatisfied forward or external declaration: '_llumod'
Unsatisfied forward or external declaration: '_lludiv'
Unsatisfied forward or external declaration: 'GetVersionExA'
Unsatisfied forward or external declaration: 'MultiByteToWideChar'
Unsatisfied forward or external declaration: 'WideCharToMultiByte'
Unsatisfied forward or external declaration: 'AreFileApisANSI'
Unsatisfied forward or external declaration: 'FormatMessageW'
Unsatisfied forward or external declaration: 'LocalFree'
Unsatisfied forward or external declaration: 'FormatMessageA'
Unsatisfied forward or external declaration: 'SetFilePointer'
Unsatisfied forward or external declaration: 'CloseHandle'
Unsatisfied forward or external declaration: 'ReadFile'
Unsatisfied forward or external declaration: 'WriteFile'
Unsatisfied forward or external declaration: 'SetEndOfFile'
Unsatisfied forward or external declaration: 'FlushFileBuffers'
Unsatisfied forward or external declaration: 'GetFileSize'
Unsatisfied forward or external declaration: 'LockFileEx'
Unsatisfied forward or external declaration: 'LockFile'
Unsatisfied forward or external declaration: 'UnlockFile'
Unsatisfied forward or external declaration: 'UnlockFileEx'
Unsatisfied forward or external declaration: 'UnmapViewOfFile'
Unsatisfied forward or external declaration: 'CreateFileMappingA'
Unsatisfied forward or external declaration: 'MapViewOfFile'
Unsatisfied forward or external declaration: 'GetTempPathW'
Unsatisfied forward or external declaration: 'GetTempPathA'
Unsatisfied forward or external declaration: 'CreateFileW'
Unsatisfied forward or external declaration: 'CreateFileA'
Unsatisfied forward or external declaration: 'GetFileAttributesW'
Unsatisfied forward or external declaration: 'DeleteFileW'
Unsatisfied forward or external declaration: 'GetFileAttributesA'
Unsatisfied forward or external declaration: 'DeleteFileA'
Unsatisfied forward or external declaration: 'GetFileAttributesExW'
Unsatisfied forward or external declaration: 'GetFullPathNameW'
Unsatisfied forward or external declaration: 'GetFullPathNameA'
Unsatisfied forward or external declaration: 'GetDiskFreeSpaceW'
Unsatisfied forward or external declaration: 'GetDiskFreeSpaceA'
Unsatisfied forward or external declaration: 'LoadLibraryW'
Unsatisfied forward or external declaration: 'LoadLibraryA'
Unsatisfied forward or external declaration: 'GetProcAddress'
Unsatisfied forward or external declaration: 'FreeLibrary'
Unsatisfied forward or external declaration: 'GetSystemTime'
Unsatisfied forward or external declaration: 'GetCurrentProcessId'
Unsatisfied forward or external declaration: 'GetTickCount'
Unsatisfied forward or external declaration: 'QueryPerformanceCounter'
Unsatisfied forward or external declaration: 'GetSystemTimeAsFileTime'
Unsatisfied forward or external declaration: 'GetSystemInfo'
Unsatisfied forward or external declaration: '_llshl'
Unsatisfied forward or external declaration: '_llushr'
Многие из них являются просто функциями Windows API и могут быть легко решены добавлением Windows
к вашему предложению использования.
На данный момент у вас осталось следующее:
Unsatisfied forward or external declaration: '_lldiv'
Unsatisfied forward or external declaration: '_llmod'
Unsatisfied forward or external declaration: 'localtime'
Unsatisfied forward or external declaration: '_llmul'
Unsatisfied forward or external declaration: '_llumod'
Unsatisfied forward or external declaration: '_lludiv'
Unsatisfied forward or external declaration: '_llshl'
Unsatisfied forward or external declaration: '_llushr'
Для решения этих проблем вам необходимо:
- Ссылка на другой файл .obj, содержащий отсутствующую зависимость.
- Реализация отсутствующей зависимости в коде Delphi в том же модуле, который содержит
$LINK
.
На самом деле я не уверен, что делают эти функции, поэтому у вас впереди еще немного работы. Я предполагаю, что эти функции являются 64-битными целочисленными арифметическими процедурами. Вероятно, вы можете перепроектировать это, написав короткие биты C для выполнения различных 64-битных арифметических операций. Затем скомпилируйте с bcc32 и посмотрите на вывод как asm
. Предположительно bcc32
обладает способностью излучать asm
. Или вы можете просто связаться с модулем Delphi и посмотреть, какая из вышеперечисленных функций соответствует операциям, которые вы использовали в своем коде C.
Вы можете извлечь localtime
из msvcrt.dll
, всегда полезный запасной вариант для отсутствующих функций времени выполнения C. Фактически, это то, что делает текущая реализация модуля crtl
, поэтому, если вы собираетесь использовать crtl
, вы также можете получить localtime
таким же образом.
Заимствуя некоторый код у Арно, следующий модуль успешно компилируется:
unit sqlite3;
interface
implementation
uses
crtl, Windows;
{$L c:\desktop\sqlite3.obj}
procedure _lldiv;
asm
jmp System.@_lldiv
end;
procedure _llmod;
asm
jmp System.@_llmod
end;
procedure _llmul;
asm
jmp System.@_llmul
end;
procedure _llumod;
asm
jmp System.@_llumod
end;
procedure _lludiv;
asm
jmp System.@_lludiv
end;
procedure _llshl;
asm
jmp System.@_llshl
end;
procedure _llushr;
asm
jmp System.@_llushr
end;
procedure localtime; cdecl; external 'msvcrt.dll';
end.
Обратите внимание, что вам не нужно предоставлять список параметров, соглашение о вызовах и т. Д. Для любой из этих функций, поскольку мы не реализуем их здесь. В каждом случае код просто делегирует реализацию.
Однако в коде для объявления функций sqlite3 по-прежнему отсутствует код. Более того, я даже не пытался проверить, работает ли он. Успешная компиляция - это только первый шаг.
Я настоятельно рекомендую вам использовать код, на который направляет вас Арно, если вы хотите использовать статическое связывание. Этот код явно использовался и тестировался, и вы также можете извлечь из этого пользу.
Статическое связывание обеспечивает удобное развертывание, но динамическое связывание с DLL намного проще.