statische Bibliotheken werden nicht gefunden, warum? FPC304

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
thosch
Beiträge: 324
Registriert: Mo 10. Jul 2017, 20:32

statische Bibliotheken werden nicht gefunden, warum? FPC304

Beitrag von thosch »

Ich kämpfe derzeit mit der Verlinkung statischer Bibliotheken für mein Projekt, von dem ich diese Bibliotheken leider nur in Binärform habe. Sie ligen im COFF Format vor, was das passende Format sein sollte.

Ich habe die fraglichen Bibliotheken sowohl im Projektpfad als auch im bin Pfad des Compilers und noch einmal in einem in der IDE bekennt gemachten Pfad meines Projektes liegen.

Trotzdem sagt mit der Compiler, er könne den Bibliothekspfad nicht finden. -lxxx.lib not found.

Den lib Pfad in der $Linklib xxx.lib Anweisung mit angeben führt nicht zum gewünschten Ergebnis.

Was kann ich tum damit meine statischen Bibliotheken korrekt in meinen Code gelinkt werden?

Ich compiliere mit FPC 3.0.4

Sollte ich die Version 3.0.0 oder niedriger verwenden?

Oder liegt eine andere Ursache vor?

Ich habe leider keine DLLs dazu, nur statische Bibliotheken und die nur im Binärcode.
.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: statische Bibliotheken werden nicht gefunden, warum? FPC

Beitrag von af0815 »

Arbeitest du mit Lazarus ? Oder direkt mit dem FPC.

Wenn mit Lazarus, dann bitte mal die ganze Ausgabe aus dem Meldungsfenster posten. Und nicht die was angezeigt wird, sondern die die über rechte Maustaste im Meldungsfenster->Save all/original messages to File ausgegeben wird.

Ich gehe davon aus, da du dll schreibst, das du unter Windows arbeitest. Nur du sagt weder was über Win 32 oder 64 noch sonstwas.

Nach deinen Angaben sagt meine Glaskugel -> andere Ursache.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

thosch
Beiträge: 324
Registriert: Mo 10. Jul 2017, 20:32

Re: statische Bibliotheken werden nicht gefunden, warum? FPC

Beitrag von thosch »

aktuell direkt mit dem FPC auch Kommandozeilenebene.

Muss ich meine .lib Dateien vielleicht in .a Dateien Konvertieren?

Wenn ja, mit welchem Tool mache ich das und wenn das ein Kommandozeilentool ist, wie sieht die Kommandozeile samt korrekter Kommandozeilenschalter aus?

Ich arbeite unter Windows 32 Bit.

Leider ist das ein Projekt meiner beruflichen Arbeit, da darf ich hier nichts preis geben. Sonst gerne.

Es geht mir darum, zu erfahren warum die mit

{$Linklib XXX.LIB}

oder

{$Linklib c:\myProject\libs\yyy.lib}

im Unitkopf im Interface Teil deklarierten Bibliotheken vom Compiler nicht gefunden werden. Sollte das wirklich so sehr Projektspezifisch sein. Bei jedem Projekt eine andere Vorgehensweise. Gibt es da wirklich keine Standardlösung, die immer funktioniert?

Soweit ich weiß, sind .LIB Bibliotheken statische Bibliotheken. Wir haben uns für diese Variante entschieden, weil die dynamischen Bibliotheken für unseren Anforderungsfall zu viele Unwägbarkeiten bergen. Stichwort dynamische Arrays oder Strings ...
.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: statische Bibliotheken werden nicht gefunden, warum? FPC

Beitrag von Winni »

Hi
Hier ist ne Seite über Free Pascal und Libraries - leider nur auf english.
Von stastischem Linken von statischen Libs steht da nix, aber von statischem Linken von dynamischen Libs.
Vielleicht hilft's ja.

Hier:

https://wiki.freepascal.org/Lazarus/FPC_Libraries

Winni

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: statische Bibliotheken werden nicht gefunden, warum? FPC

Beitrag von af0815 »

Es sollte schon xxx.lib richtig sein.

Code: Alles auswählen

Windows   .dll   .lib

Code: Alles auswählen

Windows searches a library in:
 
first in the current directory
then the system directory
finally the directories specified in the environment variable PATH (system and user path).


Was man mal machen kann, mit einem depency walker bzw. spezial Tool wie den CFF Explorer sich die Lib auch ansehen. Nicht das die für Dot-Net ist. Dann geht nichts aufgrund des Managed Code.
Dateianhänge
Beispiel wie es nicht ausehen sollte
Beispiel wie es nicht ausehen sollte
Anmerkung 2020-03-18 185920.jpg (81.02 KiB) 2205 mal betrachtet
Zuletzt geändert von af0815 am Mi 18. Mär 2020, 19:09, insgesamt 1-mal geändert.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: statische Bibliotheken werden nicht gefunden, warum? FPC

Beitrag von Winni »

Hallo!

Hier ist eine Discussion in der geklärt wird, wie man statische Bibliotheken an fpc code bindet.

Von 2017 - also klappte das schon damals:

https://fpc-devel.freepascal.narkive.com/N7GSonJ1/staticaly-link-c-c-library-lib-into-freepascal-on-windows

Winni

thosch
Beiträge: 324
Registriert: Mo 10. Jul 2017, 20:32

Re: statische Bibliotheken werden nicht gefunden, warum? FPC

Beitrag von thosch »

Danke für Eure Hilfe! Sorry für die späte Rückmelgung. Musste erst mal die verlikten Anleitungen studieren und meinen Quellcode anpassen.

Was ich aber noch nicht in den Anleitungen gefunden habe ist die Frage, ob ich eine Objektdatei die mehrere Funktionen enthält mehrmals, also unter jeder diese Objektdatei benutzenden Funktion erneut aufführen muss oder ob es ausreicht, die jeweilige Objektdatei ein einziges Mal zu verlinken.

Also so:

Code: Alles auswählen

 
function myfunc1(param: Integer): Integer; stdcall external name '_myfunc1@4
{$L func1fun2func3.o}
 
function myfunc2(param1: PChar; Param2: UINT): DWORD; stdcall '_myfunc2@8';
{$L func1fun2func3.o}
 
function myfunc3: PChar; stdcall; external name '_myfunc3@0';
{$L func1fun2func3.o}
 


Oder so:

Code: Alles auswählen

 
{$L func1fun2func3.o}
 
function myfunc1(param: Integer): Integer; stdcall external name '_myfunc1@4
 
function myfunc2(param1: PChar; Param2: UINT): DWORD; stdcall '_myfunc2@8';
 
function myfunc3: PChar; stdcall; external name '_myfunc3@0';
 
 


Welche Version muss ich wählen, damit der Linker korrekt arbeiten kann?

Will mich da vorher informieren, da hier noch mal ne Menge Arbeit auf mich zukommt. Ich musste erfahren, dass .LIB Dateien nicht verlinkt werden können, ich brauche die Objektdateien, die ich jetzt aus den Libs extrahiert habe. Da will ich bvor ich mich nun noch mal an die Arbeit mache, wissen wie ich die .o Dateien nun richtig im Quellcode aufführe, damit danach dann das Linken endlich klappt.
.

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: statische Bibliotheken werden nicht gefunden, warum? FPC

Beitrag von Socke »

thosch hat geschrieben:Was ich aber noch nicht in den Anleitungen gefunden habe ist die Frage, ob ich eine Objektdatei die mehrere Funktionen enthält mehrmals, also unter jeder diese Objektdatei benutzenden Funktion erneut aufführen muss oder ob es ausreicht, die jeweilige Objektdatei ein einziges Mal zu verlinken.

Du musst die Objekt-Datei nur einmal in dein Programm linken und kannst dann alle Funktionen daraus nutzen. Ansonsten wüsste der Linker wohl nicht, welche Funktion aus welcher Objektdatei er aufrufen sollte - obwohl sie identisch sind - und ich wüsste auch nicht, wie man ihm das sagen sollte.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten