AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Qt statisch linken?

Ein Thema von cookie22 · begonnen am 19. Aug 2013 · letzter Beitrag vom 26. Mär 2020
Antwort Antwort
DualCoreCpu
(Gast)

n/a Beiträge
 
#1

AW: Qt statisch linken?

  Alt 25. Mär 2020, 19:13
Danke erst mal für die Antworten. Leider gewinne ich aber den Eindruck dass in diesem Forum die DLL noch mal als .obj Datei neu übersetzt wird.

Ich aber will wissen wie es danach weiter geht, wenn ich die statische Bibliothek bereits habe. In meinem Fall liegen die Bibliotheken in Assembler vor, Aufrufkonverntion dennoch STDCALL. Und zu allem Übel auch noch im :LIB Format, nicht als .OBJ!

Nun geht es darum, wie meine external Definition aussehen muss, die unterscheidet sich zumindest in Freepasacl von derjenigen bei DLLs.

In Freepascal:

{$linklib mylibrary.lib} //Meine aktuellen Bibliotheken die ich linken will, liegen im .lib Format vor

oder

{$L mylibrary.lib} //Diese Form kenne ich noch aus Turbo Pascal Zeiten, dort aber mit ,obj Dateien, statt .lib Dateien

Damals hat man dann die Bibliotheksprozedur so geschrieben und die Obj Datei dazu gelinkt:

procedure myLibProc(myParam: mytype); external;
{$L mylibrary.obj} //hier nun unterhalb der Bibliotheksfunktion die Verlinkung der die Funktion enthaltenden Bibliothek.

Nun hab ich aber eine .LIB Datei mit vielen Bibliotheksfunktionen vorliegen, die auch aus mehreren .obj Dateien stammen, die zu dieser.lib Bibliothek zusammengefasst sind.

Kann ich da genau so vorgehen wie bei reinen .obj Dateien?

[delphi]
procedure proc1; external;
{$L mylib.lib}

function func1: Integer; external;
{$L mylib.lib}

function func2(param1: PChar): PChar; external;
{$L mylib.lib}
[/quote]

Ich habe schon mehrere Varianten ausprobiert, die alle nicht zum Erfolg führen.

Verwendet hier Freepascal dieselbe Syntax wie Delphi?

Abgesehen davon, dass Delphi die Funktions- und Procedure Köpfe sowohl im INterfaceteil der Unit und im Implementationsteil und nur dort mit den EXTERNAL Deklarationen aufführt, während Freepascal die Funktions und Proceure Köpfe nur im Interface Teil und dort dannn mit den External Deklarationen aufführt. Mit geht es hier um die weitere Attribute NAME <libname> ...

Also:

function myfunc: mytype; stdcall; externel dllname name 'myfunc'; für dlls.

und

function myfunc: mytype; stdcall; externel name '_myfunc@0'; //wenn statisch zu linken

So habe ich es jetzt in meinen Interface Units. Die Bibliothek mit den Funktionen linke ich zu Beginn des Codes im Interface Teil nach der Uses Klausel, sonst nirgends mehr.

Gibt es noch eine andere Möglichkeit? Oder muss ich die {$L ...} oder {$Linklib ...} Anweisung unter jede einzelne Funktion schreiben?

Wenn ich nämlich den unmangled name "myfunc" verwende, findet der Linker meine Bibliothek(en) nicht, obwohl ich die sowohl im dem Linker übergebenen Verzeichnis, als auch sicherheitshalber nochmals in meinem Projektverzeichnis und dann nochmals im Bin Verzeichnis des Compilers liegen habe, wo ja auch der Linker ist. Warum werden also meine Bibliotheken nicht gefunden. Wenn ich die unmangled names verwende und das nicht geht, dann müsste doch die Fehlermeldung lauten: Falscher Funktionsname oder Funktion nicht gefunden, aber doch nicht Bibliothek nicht gefunden. Deshalb will ich das erst mal alles theoretisch durchspielen, bevor ich rumprobiere ob es denn nun cpmpiliert.

Geändert von DualCoreCpu (25. Mär 2020 um 19:17 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.346 Beiträge
 
Delphi 12 Athens
 
#2

AW: Qt statisch linken?

  Alt 25. Mär 2020, 20:50
Ja, die Funktionsdeklaration mit EXTERNAL muß gemacht werden. (ohne Angabe einer DLL, wie beim normalen Import)
Name der Funktion wie in der OBJ-Datei. Ich weiß nicht, ob hier auch eine Umbenennung möglich ist, so ala procedure MeinName; external name 'DerenName'; .


LIB-Dateien kann man mit Delphi erstellen, aber nicht (direkt) verwenden.
Du mußt also die LIB-Datei erst umwandeln, um sie benutzen zu können.
Entweder aus der LIB eine OBJ machen, oder die LIB in eine DLL linken und dann normal importieren.

http://rvelthuis.de/articles/articles-cobjs.html
https://www.delphipraxis.net/177194-...verwenden.html
http://docwiki.embarcadero.com/RADSt...en_Anwendungen
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
DualCoreCpu
(Gast)

n/a Beiträge
 
#3

AW: Qt statisch linken?

  Alt 26. Mär 2020, 00:15
Danke @himisu, obwohl mir das gar nicht gefällt. Kann denn Freepascal .lib Dateien so direkt verwenden oder ist dort auch die Umwandlung nötig?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.346 Beiträge
 
Delphi 12 Athens
 
#4

AW: Qt statisch linken?

  Alt 26. Mär 2020, 07:43
Wollte erst "glaub nicht" sagen, aber grad noch entdeckt, dass es dort neben {$LINK ...} auch ein {$LINKLIB ...} gibt.

https://www.freepascal.org/docs-html/prog/progsu43.html
https://www.freepascal.org/docs-html...53-520001.2.46

Hmmm, man könnte nun auf die blöde Idee kommen mit FreePascal eine DCU zu erstellen, wo der Import drin steckt, aber diese DCU dann in Delphi verwenden zu wollen wird wohl nicht gehen.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:11 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz