ErnstVolker hat geschrieben:In den Quellen gibt es aber auch einen Unterordner mit *.lib-Dateien. Die haben gleiche Namen wie die DLL's. Sind wohl Bibliotheken (??? Vorstufen ??? für DLL's?).
.lib's sind statische Bibliotheken. Im gegensatz zu dynamischen Bibliotheken (dll's) werden diese im kompilierschritt in die Executeable gelinkt, und sind somit teil deines programms. DLL's hingegen sind shared libraries und müssen vorliegen um benutzt zu werden.
Statische bibliotheken haben den vorteil das man keine dll's braucht, dynamische bibliotheken haben aber auch ihre vorteile. Zum einen benötigst du den Code nur einmal, also 10 programme die die selbe DLL brauchen müssen nicht alle die DLL mitliefern (Geteilte DLL's liegen bei windows im system32 ordner). Unter Linux z.b. installieren programme Ihre abbhängigkeiten über einen Paketmanager, der stellt sicher das die libs nicht mehrfach mitgeliefert werden. Ein weiterer vorteil von DLL's ist das sie unabhängig vom programm sind. Wenn also z.B. eine Sicherheitslücke Publik werden sollte (z.B. du benutzt die OpenSSL) kannst du ganz einfach die Lib updaten mit den security fixes, ohne jede anwendung die diese Lib verwendet auch upzudaten. Und DLL's können dynamisch geladen werden.
Wenn du deine software nur für Windows kompilieren möchtest würde ich dir empfehlen bei statischen bibliotheken zu bleiben, unter Linux mit paketmanagern macht das grade für eine so häufig verwendete Bibliothek wie die OpenCV überhaupt keinen sinn, und da solltest du dann dynamische bibliotheken nehmen.
Außerdem, da kenn ich mich nicht so gut aus, könnte es sein das es Lizenzrechtlich einen Unterschied machen kann ob du dein dyn oder statische lib benutzt, das solltest du auf jedenfall auch vorher prüfen
Wenn das ausführbare Programm ohne die opencv-Dll's auskommen soll, muss man dann gegen diese Bibliotheken linken? Wenn ja, wie stellt man das in der IDE ein?
Mit der IDE hat das erst mal gar nix zu tun, sondern ist rein sache des Compilers. Der FPC unterstützt dafür die LinkLib direktive. Beispiel:
Code: Alles auswählen
unit libtest;
{$MODE ObjFpc}{$H+}
interface
{$LINKLIB c}
function strlen(P: pchar): longint; cdecl; external;
implementation
end.
Dieser code linkt (statisch) die LibC in den code, und stellt die funktion strlen aus dieser bereit.
Für dein beispiel musst du den dateinamen in das LinkLib schreiben (statt dem c) und die strlen definition durch die signatur der funktionen in der Library austauschen. Dann sollte beim kompilieren der FPC sich um alles kümmern