Socke hat geschrieben:
Ohne mir den Quelltext angesehen zu haben, könntest du auch falsch liegen.
Ausschnitt aus sqlite3.inc:
Code: Alles auswählen
uses
ctypes,
{$ifdef LOAD_DYNAMICALLY}
SysUtils, DynLibs;
{$else}
DynLibs;
{$ifdef darwin}
{$linklib sqlite3}
{$endif}
{$endif}
const
{$IFDEF WINDOWS}
Sqlite3Lib = 'sqlite3.dll';
{$else}
Sqlite3Lib = 'libsqlite3.'+sharedsuffix;
{$endif}
{$IFDEF LOAD_DYNAMICALLY}
{$DEFINE D}
{$ELSE}
{$DEFINE S}
{$ENDIF}
[...]
{$IFDEF S}function{$ELSE}var{$ENDIF}sqlite3_libversion{$IFDEF D}: function{$ENDIF}(): pchar; cdecl;{$IFDEF S}external Sqlite3Lib;{$ENDIF}
{$IFDEF S}function{$ELSE}var{$ENDIF}sqlite3_libversion_number{$IFDEF D}: function{$ENDIF}(): cint; cdecl;{$IFDEF S}external Sqlite3Lib;{$ENDIF}
[...]
{$IFDEF LOAD_DYNAMICALLY}
[...]
procedure LoadAddresses(LibHandle: TLibHandle);
begin
pointer(sqlite3_libversion) := GetProcedureAddress(LibHandle,'sqlite3_libversion');
pointer(sqlite3_libversion_number) := GetProcedureAddress(LibHandle,'sqlite3_libversion_number');
[...]
function TryInitialiseSqlite(const LibraryName: string): Boolean;
begin
Result := false;
if (RefCount=0) then
begin
SQLiteLibraryHandle := LoadLibrary(LibraryName);
Dynamisches Linken heißt soviel wie Funktionszeiger zur Laufzeit bestimmen. Statisch gelinkt heißt in diesem Kontext, dass die Funktionszeiger beim Kompilieren bestimmt werden.
Ich wurde mal belehrt, dass unter Linux zwischen "static shared" und "dynamic shared" unterschieden wird. Bei static shared werden die Bibliotheken durch ld beim Programmstart geladen. Sind die Bibliotheken auf dem Zielsystem nicht vorhanden, kann das Programm nicht starten. Dies birgt den Nachteil in sich, dass für IDE's, die Komponenten enthalten welche Bibliotheken verwenden, auch alle Bibliotheken installiert sein müssen, sonst kann die IDE nicht starten. Daher wird für Komponenten meist dynamic shared verwendet. Dabei werden die Bibliotheken durch das Programm bei Bedarf explizit durch loadlibrary() geladen und die Funktionsadressen durch getprocedureaddress() aufgelöst.
Monta sucht den dritten Weg, wo der Bibliothekscode zur Kompilierzeit hinzugebunden wird. AFAIK wird dazu {$LINK} anstatt {$LINKLIB} verwended, es müssten für diesen Fall wohl noch weitere Änderungen an sqlite3.inc vorgenommen werden.
Martin