[erledigt] Nur eine Datei - wie?

Für Fragen rund um die Ide und zum Debugger
Antworten
Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 988
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Linux Mint 20 , FPC 3.3.1 , Lazarus 2.1.0 -Win10 & XE7Pro
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

[erledigt] Nur eine Datei - wie?

Beitrag von kralle »

Moin,

wie kann ich unter Lazarus dafür sorgen, das ich am Ende möglich nur eine Datei erhalte, die ich dann weitergeben kann?
Also, unter Windows, keine extra DLLs. Unter Linux und Co möglichst auch nur eine Datei.

Das z.B. eine Datenbankdatei extra bleiben wird, ist mir klar, aber alles andere wäre schön in einer Datei zu haben.
Auch wenn die Programmdatei da durch größer wird.

Geht das aus Copyright-Gründen eigentlich?

Gruß Heiko
Zuletzt geändert von kralle am Di 23. Jul 2019, 14:20, insgesamt 1-mal geändert.
OS: Manjaro Linux, Debian und Windows 10
FPC-Version: 3.2.2 , Lazarus 3.0
+ Delphi XE7SP1

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: Nur eine Datei - wie?

Beitrag von MacWomble »

Ist das nicht immer nur eine Datei ? (Außer den DB-Bibliotheken)
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 988
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Linux Mint 20 , FPC 3.3.1 , Lazarus 2.1.0 -Win10 & XE7Pro
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

Re: Nur eine Datei - wie?

Beitrag von kralle »

Moin,

MacWomble hat geschrieben:Ist das nicht immer nur eine Datei ?

Und warum braucht man dann einen Installer, der die Dateien in die richtigen Unterordner packt?

Zusatzfrage: Kann ich mittels "Erstellmodi" und "Hinzufügungen und Beeinflussen" für jedes OS ein Unterverzeichnis erstellen, in dem am Ende nur die ausführbare Datei liegt?

Gruß Heiko
OS: Manjaro Linux, Debian und Windows 10
FPC-Version: 3.2.2 , Lazarus 3.0
+ Delphi XE7SP1

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: Nur eine Datei - wie?

Beitrag von Socke »

kralle hat geschrieben:
MacWomble hat geschrieben:Ist das nicht immer nur eine Datei ?

Und warum braucht man dann einen Installer, der die Dateien in die richtigen Unterordner packt?

Für Windows habe ich diese Methode gefunden: https://www.thoughtco.com/load-a-dll-fr ... ce-1058456
Ich gehe davon aus, dass dies nur unter Windows funktioniert. Plattformübergreifend wäre es am einfachsten, die Bibliotheken in eine temporäres Verzeichnis zu extrahieren und dann von dort zu laden.
Bleibt dann nur noch zu hoffen, dass alle verwendeten Units auch dynamisches Linken unterstützen.

kralle hat geschrieben:Zusatzfrage: Kann ich mittels "Erstellmodi" und "Hinzufügungen und Beeinflussen" für jedes OS ein Unterverzeichnis erstellen, in dem am Ende nur die ausführbare Datei liegt?

Per Default wird das Programm im Programmverzeichnis abgelegt. Du kannst auch Variablen im Pfad nutzen: release\$(TargetCPU)-$(TargetOS)\project1
Über Erstellmodi kannst die Pfade für jeden Modus einzeln ändern. Hier hättest du den Vorteil, dass du aus der IDE heraus mehrere Modi auf einmal erstellen kannst. Bei den Variablen oben müsstest du lazbuild mehrfach mit ensprechenden Parametern aufrufen. Passende (Cross-)Compiler jeweils vorausgesetzt.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Nur eine Datei - wie?

Beitrag von Warf »

Unter windows geht das auf jeden fall (keine Ahnung wie, hier hat aber jemand ja schon was gefunden), unter anderen systemen (linux, mac) wär das einzige was mir einfallen würde (was nicht unglaublich hacky wäre) wäre die Bibliotheken als resourcen (oder konstanten) zu speichern und zur laufzeit in ein temporäres Verzeichnis zu entpacken. Das funktioniert auf jeden fall auf jeder plattform

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: Nur eine Datei - wie?

Beitrag von af0815 »

Ich habe es mit Resourcen unter Windows gemacht um die Datenbanktreiber in die Applikation zu bekommen.

Mittlerweile arbeite ich mit einen Installer, da ansonsten es nicht sichergestellt ist, das der DB Treiber das auf die Platte kopieren verträgt. Einerseits ist das kopierenin den Programmpfad schon mal durch ein sauber konfiguriertes System unterbunden. Andererseits stossen sich die AV Programme oft an dem Vorgang. Deshalb gleich richtig mit einen Installer. Ist zwar das erste mal mehr aufwand, später aber nur noch Copy & Paste
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Nur eine Datei - wie?

Beitrag von Warf »

Installer haben noch einen vorteil, wenn es netzwerkinstaller sind können die immer die neuste version runterladen. Außerdem wenn man konfig dateien hat kann der installer bereits einen default anlegen.

Grade für größere projekte die ordnerstrukturen und zusätzliche daten brauchen verwende ich immer nen netzwerk installer

Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 988
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Linux Mint 20 , FPC 3.3.1 , Lazarus 2.1.0 -Win10 & XE7Pro
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

Re: Nur eine Datei - wie?

Beitrag von kralle »

Moin,

erst einmal Danke, für Eure vielen Antworten.
Inzwischen verstehe ich, dass es doch sinnvoll sein kann Installer zu nutzen.

Das was ich so programmiere, sind meistens kleine Tools, die keine DLL oder der gleichen nachladen und so als einen Datei weitergegeben werden können.

Gruß Heiko
OS: Manjaro Linux, Debian und Windows 10
FPC-Version: 3.2.2 , Lazarus 3.0
+ Delphi XE7SP1

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: [erledigt] Nur eine Datei - wie?

Beitrag von af0815 »

Egal ob DB oder fpReport, man braucht öfters als man denkt eine dll oder so.

Gerade bei den vermeintlich kleinen Tools hat es mich am meisten Zeit gekostet.

Edit: Ein Beispiel wie man eine dll aus einer Resource ins Programmverzeichnis extrahieren kann. Das Beispiel ist mit dem MS-Sql Datenbanktreiber- Dazu muss dieser in den Resourcen unter dem Namen SYDBDB eingebunden worden sein. Das geht natürlich mit allen Dateien Resourcen so.

Ich habe die Schnippsel aus einen größeren Code herauskopiert, kann sein, das die uses nicht komplett ist. Die Funktion sieht nach, o der Treiber da ist, ansonsten wird er aus den Resourcen erstellt.

Code: Alles auswählen

 
uses
  SysUtils, FileUtil, LCLType;
 
function LoadFromResourceAndMakeFile(Instance: THandle; const ResName: String;
  const FileAndPathName: String): Boolean;
var
  S: TResourceStream;
  F: TFileStream;
begin
  Result := False;
  // create a resource stream which points to our resource
  S := TResourceStream.Create(Instance, ResName, RT_RCDATA);
  try
    // create a file  in the application directory
    F := TFileStream.Create(FileAndPathName, fmCreate);
    try
      F.CopyFrom(S, S.Size); // copy data from the resource stream to file stream
      Result:=True;
    finally
      F.Free; // destroy the file stream
    end;
  finally
    S.Free; // destroy the resource stream
  end;
end;
 
function CheckPrerequisites: boolean;
var
  Drivername: String;
begin
  Result:= False;
  Drivername:= IncludeTrailingPathDelimiter(ExtractFileDir(ProgramDirectory))+ 'sybdb.dll';
  try
    if not FileExists(Drivername) then
      Result:= LoadFromResourceAndMakeFile(HINSTANCE,'SYBDB',Drivername)
    else
      Result := True;
  except
    DebugLn('CheckPrerequisites cannot create Driverfile sybdb.dll');
    Result:= false;
  end;
end;
 
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten