Library im Programmverzeichnis

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

Library im Programmverzeichnis

Beitragvon Ralf » 18. Dez 2019, 14:59 Library im Programmverzeichnis

Hallo Zusammen,

ich habe schon im Datenbankbereich speziell gefragt, ob man benötigte Libraries; welche ja unter Linux (zumindest bei mir) unter /usr/lib/ liegen; auch irgendwie mit in das (finale) Programmverzeichnis kopieren kann.
Was muss man da beachten (außer Dateirechte) oder funktioniert das prinzipiell nicht?

Unter Windows habe ich von eh her immer die DLLs ins ProgDir kopiert und da werden sie auch automatisch gesucht.... was unter Linux nicht der Fall zu sein scheint...
Zum Beispiel will die benötigte sqlite3.so nicht gefunden werden, wenn sie im (finalen) Programmverzeichnis liegt.

Wäre schön, wenn da zu wer was schreiben könnte.

Viele Grüße,
Ralf
Kubuntu 18.04
Ralf
 
Beiträge: 45
Registriert: 29. Jan 2014, 18:31
OS, Lazarus, FPC: Ubuntu 18.04 LTS (L 2.0.6 FPC 3.3.1) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Warf » 18. Dez 2019, 15:31 Re: Library im Programmverzeichnis

Du willst hier was machen was Linux, aus gutem grund wohlgemerkt, nicht will das du machst.
Die Linux philosophie ist das du alle libraries an einem Ort hast, um die DLL hell wie man sie aus windows kennt zu vermeiden. Und es gibt ne menge guter gründe warum das so ist. Ein beispiel, weil du im anderen Thread nach SQLite gefragt hast. Sagen wir mal du benutzt die aktuellste SQLite version, grad erst rausgekommen, um dein programm zu verteilen. Du packst nen schönen installer, lädst es hoch, leute laden es runter und installieren es. Jetzt kommt 2 wochen später raus das diese SQLite version ein Massives memory leak hat. Jetzt musst du einen neuen installer packagen, deine Nutzer informieren das sie doch die alte version löschen sollen, und die neue installieren sollen.

Jetzt bekommt das ein nutzer nicht mit, benutzt dein programm, und nach ein paar stunden oder so freezed der PC des nutzers und er kann nix mehr machen. Die arbeit von mehreren stunden verloren, nicht nur in deinem programm, sondern in allem was der nutzer ungespeichert offen hatte.

Nächstes szenario, ne sicherheitslücke wurde entdeckt womit man über SQLite ne shell popen kann. Selbes szenario wie vorher, user updated nicht rechzeitig, er lädt daten die "zufällig" eine shell poppen mit dem command "rm -rf ~" (merke, das braucht keine sudo rechte) und zack sein gesammter Useraccount mit allen daten weg.

Das selbe kann natürlich auch vorkommen, wenn du selbst mal nicht jeden tag auf dem dev log der Bibliothek nachschaust ob sich da was geändert hat, immerhin bist du ja auch nur ein mensch, und ich kann mir gut vorstellen das wenn du mal für ne woche in urlaub bist, du nicht unbedingt emergency packages von deiner software bauen willst, weil eine sicherheitslücke aufgetaucht ist

Die pakete im paketmanager werden ziemlich schnell wenn solche bugs rauskommen geupdated, und nutzer die ihr system up to date halten sind vor sowas ziemlich sicher.

Von dem problem das jede library damit x mal auf dem rechner ist mal ganz von abgesehen (ich mein stell dir mal vor jedes programm was GTK benutzen würde, würde die 1GB library selbst mitliefern)

Das heist natürlich nicht das es nicht geht, und es gibt fälle in denen man einen anderen Suchpfad für libraries benutzen will. Ich bin mir zwar ziemlich sicher das dein grund keiner davon ist (so wie ich das sehe willst du einfach nur bequemer haben, was ein absolut beschissener grund ist die sicherheit deiner nutzer aufs spiel zu setzen), dann kannst du es über andere sachen machen, schau mal hier: Link. Das einfachste ist vor dem start einfach die LD_LIBRARY_PATH variable zu setzen (also z.b. ein starter bash script zu schreiben was dann das programm mit der richtig gesetzten variable startet)
Warf
 
Beiträge: 1343
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: MacOS | Win 10 | Linux | 
CPU-Target: x86_64
Nach oben

Beitragvon Ralf » 18. Dez 2019, 18:48 Re: Library im Programmverzeichnis

Warf hat geschrieben:Du willst hier was machen was Linux, aus gutem grund wohlgemerkt, nicht will das du machst.
Die Linux philosophie ist ..


Hallo Warf,

WENN ich jetzt danach gefragt hätte, HÄTTEST Du mir damit vielleicht geholfen.
So leider überhaupt nicht, denn ich fragte danach, wie man das hinbekommt und nicht nach Gründen dafür es nicht hinzubekommen...

Ich kann genauso viel Gründe aufzählen, warum das von Vorteil ist, es so zu machen, wie ich es unter Windows schon seit 20 Jahren mache..... doch das langweilt doch alle, denn wie so oft im Leben hat jede Medaille zwei Seiten.

Ist hier noch jemand der meinen Wunsch nachvollziehen kann UND weiß wie ich es mit überschaubaren Aufwand hinbekommen kann?

Danke für Antworten auf meine Frage.

Grüße,
Ralf
Kubuntu 18.04
Ralf
 
Beiträge: 45
Registriert: 29. Jan 2014, 18:31
OS, Lazarus, FPC: Ubuntu 18.04 LTS (L 2.0.6 FPC 3.3.1) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Warf » 18. Dez 2019, 19:04 Re: Library im Programmverzeichnis

Ralf hat geschrieben:
Warf hat geschrieben:Du willst hier was machen was Linux, aus gutem grund wohlgemerkt, nicht will das du machst.
Die Linux philosophie ist ..


Hallo Warf,

WENN ich jetzt danach gefragt hätte, HÄTTEST Du mir damit vielleicht geholfen.
So leider überhaupt nicht, denn ich fragte danach, wie man das hinbekommt und nicht nach Gründen dafür es nicht hinzubekommen...

Ich kann genauso viel Gründe aufzählen, warum das von Vorteil ist, es so zu machen, wie ich es unter Windows schon seit 20 Jahren mache..... doch das langweilt doch alle, denn wie so oft im Leben hat jede Medaille zwei Seiten.

Ist hier noch jemand der meinen Wunsch nachvollziehen kann UND weiß wie ich es mit überschaubaren Aufwand hinbekommen kann?

Danke für Antworten auf meine Frage.

Grüße,
Ralf


Jetzt bin ich aber beleidigt, immerhin ist mein letzter Paragraph ne genaue Beschreibung wie du das hinbekommst. (Bzw gibt nen Link der viele Möglichkeiten beschreibt und ich beschreib eine davon)

Auch wenn ich der Meinung bin das das was du machst strunz dumm ist (und ja bitte nenn die Gründe, ich höre gerne, denn ich glaube das es keine Guten sind), ABER ich hab die Frage beantwortet.
Wenn du nicht lesen kannst scheiss mich nicht an

Und nur weil du was seit 20 Jahren so machst heißt das nicht das das was du machst in irgend einer Form gut ist. Vor 20 Jahren war Softwareentwicklung viel beschissener als heute, und zwar so, das voll Clinton zu seiner Präsidentschaft gesagt hat das der Stand der Software Entwicklung keine ingenieurwissenschaft ist sondern eher schwarze Magie
Das du es seit 20 Jahren so machst ist also eher ein Grund dagegen es so zu machen

Es gibt an sich 2 gründe warum du das machen willst: 1. Das programm braucht genau spezielle versionen von ner bibliothek. Z.B. du willst profiling machen, dann ist ein profiling build der entsprechenden Bibliotheken sinnvoll. 2. Auf dem rechner hat man keine rechte was zu installieren.
Bei 1. muss man halt selbst garantieren können das man die neuste version hat/alle hotfixes hat, oder im anwendungsdesign ist es festgelegt das das nicht möglich ist (z.B. aus kompatibilität wird ne 4 jahre alte version gebraucht, wenn das ned grad ne LTS verion ist, wirds dafür einfach keine fixes mehr geben, selbst wenn da ein riesiges sicherheitsleck auftaucht). Um bei dem profiling beispiel zu bleiben, kann man da beim bauen dann über git oder svn sich die neusten hotfixes besorgen, befor man den profiling build baut gegen den man linkt. Für 2. gibt es bessere möglichkeiten, z.b. Docker. Damit kann man die aktuellsten versionen immernoch aus den offiziellen repos ziehen, benötigt aber keine admin rechte auf dem Host system
Warf
 
Beiträge: 1343
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: MacOS | Win 10 | Linux | 
CPU-Target: x86_64
Nach oben

Beitragvon theo » 18. Dez 2019, 20:28 Re: Library im Programmverzeichnis

Seid lieb zueinander und achtet auf das Vokabular. Wörter wie "beschissen" und "strunz dumm" sind nicht hilfreich.
theo
 
Beiträge: 8247
Registriert: 11. Sep 2006, 18:01

Beitragvon Ralf » 18. Dez 2019, 21:52 Re: Library im Programmverzeichnis

Warf hat geschrieben:
Jetzt bin ich aber beleidigt, immerhin ist mein letzter Paragraph ne genaue Beschreibung wie du das hinbekommst. (Bzw gibt nen Link der viele Möglichkeiten beschreibt und ich beschreib eine davon)

Nun, ich wollte Dich nicht beleidigen, dass Du jedoch beleidigt bist, hat nichts mit mir zu tun.
Deine verlinkte Seite hat nicht viel mit Lazarus zu tun... kurz; es hilft mir gerade nicht besonders... dennoch DANKE!

Warf hat geschrieben:Auch wenn ich der Meinung bin das das was du machst strunz dumm ist (und ja bitte nenn die Gründe, ich höre gerne, denn ich glaube das es keine Guten sind), ABER ich hab die Frage beantwortet.

Beleidigungen scheinen eher Dein Ressort zu sein als mein, wenn ich lese das Du meine Bestrebungen als strunz dumm bezeichnest. Nun denn, wenn Du andere als dumm darstellen musst, damit Du dich für schlau halten kannst... es sei Dir gegönnt.
Zumindest fällt es Dir scheinbar schwer Deine Überheblichkeit zu verbergen.

Warf hat geschrieben:Wenn du nicht lesen kannst scheiss mich nicht an


Naja... wenn Du Dich angeschissen fühlst... ist auch das lediglich Deine Wahrnehmung... und hat absolut nichts mit meiner ursprünglichen Frage zu tun...
Und wegen dem nicht lesen können: Ich hatte danach gefragt wie ich unter Lazarus Libraries im aktuellen Verzeichnis nutzen kann nicht nach irgendwelchen Anleitungen über die Erstellung und Funktionsweise von shared libraries im Allgemeinen....
Wer liest nicht richtig oder anders gesagt, wer hat hier scheinbar überhaupt kein Interesse zu helfen und stattdessen lieber herumzustänkern?

Warf hat geschrieben:Und nur weil du was seit 20 Jahren so machst heißt das nicht das das was du machst in irgend einer Form gut ist.

Da kann ich dir mal teilweise zustimmen, denn dass heißt es tatsächlich nicht immer.
Ich mache das seit 20 Jahren so, weil es sich als praktikabel erwiesen hat UND weil es mir so gefällt.
In so fern IST ES gut so.

Warf hat geschrieben:Vor 20 Jahren war Softwareentwicklung viel beschissener als heute, und zwar so, das voll Clinton zu seiner Präsidentschaft gesagt hat das der Stand der Software Entwicklung keine ingenieurwissenschaft ist sondern eher schwarze Magie

Vor 20 Jahren waren die grundsätzlichen Aspekte der Softwareentwicklung die selben wie heute...
Schwarze Magie war damals genauso wenig im Spiel wie heute...
Komische Ansichten bzw. Wahrnehmungen hast Du...

Warf hat geschrieben:Das du es seit 20 Jahren so machst ist also eher ein Grund dagegen es so zu machen


Ahja...
Zum Glück gibt es Leute wie Dich.... :wink:

Dass erfahrene Leute keine große Lust haben langweilige Anfängerfragen zu beantworten, kann ich absolut verstehen....
So gibt es Leute die keine Lust haben auf meine Frage zu antworten und Leute die das auch nicht wissen.
Und dann gibt es noch die anderen... wo es schwer ist zu erkennen was die Motivation ist....
Kubuntu 18.04
Ralf
 
Beiträge: 45
Registriert: 29. Jan 2014, 18:31
OS, Lazarus, FPC: Ubuntu 18.04 LTS (L 2.0.6 FPC 3.3.1) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Ralf » 18. Dez 2019, 22:09 Re: Library im Programmverzeichnis

Warf hat geschrieben:Es gibt an sich 2 gründe warum du das machen willst: 1. Das programm braucht genau spezielle versionen von ner bibliothek. Z.B. du willst profiling machen, dann ist ein profiling build der entsprechenden Bibliotheken sinnvoll. 2. Auf dem rechner hat man keine rechte was zu installieren.


Es reicht doch schon ein Grund, oder nicht?
Obwohl beide Gründe schon nicht praxisfern sind, gibt es noch mehr Gründe...
Der zweite Grund ist im beruflichen Umfeld fast Standard, die Leute haben KEINE Installationsrechte, weswegen es auch tausende Pocket-Versionen mancher Software gibt.
Unzählige Tools von Fernwartung bis hin zu anderen Helferlein..... sie haben alle gemein, dass man sie einfach irgendwo hin kopiert oder auspackt und sie starten kann.
Einige Dateimanager und viele andere ähnliche Tools funktionieren auch z. B. schon seit mehr als 20 Jahren so, dass man einfach das Programmverzeichnis irgendwo hin kopiert (auch auf anderen Rechnern) und sie laufen direkt...

Allerdings kenne ich das in der Tat von Windows nur in diesem Umfang so.
Ich kann nicht sehen und verstehen, was daran nun schlecht sein sollte. Sie sind DESWEGEN so beliebt, weil sie einfach direkt funktionieren.

Das hatte auch mit meiner Frage zu tun: Geht das nicht "einfach" auch unter Linux so? Ohne Scripte und Docker und andere riesige Verbiegungen auf OS-Ebene?
Ich frage nach dem WIE und nicht nach Philosophien...

Warf hat geschrieben:Bei 1. muss man halt selbst garantieren können das man die neuste version hat/alle hotfixes hat, oder im anwendungsdesign ist es festgelegt das das nicht möglich ist (z.B. aus kompatibilität wird ne 4 jahre alte version gebraucht, wenn das ned grad ne LTS verion ist, wirds dafür einfach keine fixes mehr geben, selbst wenn da ein riesiges sicherheitsleck auftaucht). Um bei dem profiling beispiel zu bleiben, kann man da beim bauen dann über git oder svn sich die neusten hotfixes besorgen, befor man den profiling build baut gegen den man linkt. Für 2. gibt es bessere möglichkeiten, z.b. Docker. Damit kann man die aktuellsten versionen immernoch aus den offiziellen repos ziehen, benötigt aber keine admin rechte auf dem Host system


Viel zu kompliziert das alles....
Nicht meine Welt... und schon gar nicht mein Bestreben.
Kubuntu 18.04
Ralf
 
Beiträge: 45
Registriert: 29. Jan 2014, 18:31
OS, Lazarus, FPC: Ubuntu 18.04 LTS (L 2.0.6 FPC 3.3.1) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Warf » 19. Dez 2019, 00:44 Re: Library im Programmverzeichnis

Ralf hat geschrieben:Nun, ich wollte Dich nicht beleidigen, dass Du jedoch beleidigt bist, hat nichts mit mir zu tun.
Deine verlinkte Seite hat nicht viel mit Lazarus zu tun... kurz; es hilft mir gerade nicht besonders... dennoch DANKE!

Nur weil da nicht lazarus dabei steht heists nicht das es nicht für lazarus ist. Das ist für allgemeine Linux ELF executables, darunter fallen auch mit fpc kompilierte programme. FPC programme benutzen wie alle anderen ELF programme auch ld.so zum laden von dynamischen bibliotheken unter Linux

Ich bin beleidigt weil du mir unterstellst deine Frage nicht beantwortet zu haben und dann so tun als wenn meine antwort nicht valide ist. Ich hab dir genau gegeben wonach du gefragt hast, einen weg die so mitzuliefern. Das ist nur minimal besser als mich als lügner zu bezeichnen. Man braucht keine Beleidigungen um beleidigt zu sein. Im Gegenteil, Beleidigungen gehen mir am arsch vorbei. Wenn jemand aber behauptet ich hätte was gesagt was ich nicht getan hab (oder ich hätte eine frage nicht beantwortet, obwohl ich es klar getan hab) bin ich nunmal beleidigt.

Wenn dus immer noch nicht verstehst, hier ganz konkret:
In dem ordner in dem du dein programm liegen hast erstellst du ein bash script programname.run:
Code: Alles auswählen
#!/bin/bash
 
PDIR=$(dirname $0)
LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:$(realpath ${PDIR})" ${PDIR}/programname $@

Statt dein programm jetzt über die normale exec: "programname" zu starten, startest du es über "programname.run", alles andere wie gehabt. Das sollte dein problem lösen.

Wenn du mir aber nicht glaubst, und keine lust hast diesen 2 zeiler auszuprobieren, sondern ihn weiter kategorisch ablehnen willst, weil auf dem Link nicht Lazarus steht (obwohl das ein Linux Problem und kein Lazarus problem ist ...) im FPC wiki steht:
Linux searches a library in this order:

first in the paths of the environment variable LD_LIBRARY_PATH
then in /lib
then /usr/lib
finally the paths of /etc/ld.so.conf



Ralf hat geschrieben:Beleidigungen scheinen eher Dein Ressort zu sein als mein, wenn ich lese das Du meine Bestrebungen als strunz dumm bezeichnest. Nun denn, wenn Du andere als dumm darstellen musst, damit Du dich für schlau halten kannst... es sei Dir gegönnt.
Zumindest fällt es Dir scheinbar schwer Deine Überheblichkeit zu verbergen.


Seit wann ist strunz dumm eine Beleidigung? Wenn, manche sachen sind einfach dumm. Wenn ich nen Löffel zimt esse ist das auch strunz dumm, das so zu bezeichnen ist keine beleidingung. Wohlgemerkt ich hab nicht dich als dumm bezeichnet, sondern die aktion. Schlaue leute tuen dumme sachen, oftmals weil sie entweder nicht wissen das es dumm ist, oder weil sie nicht wissen das es bessere alternativen gibt. In dem fall ist im vergleich zu allen alternativen das selbst mitliefern der libraries dumm. Warum, weil AppImage oder docker genau das macht was du willst (eine one click version der anwendung erzeugen) ohne die ganzen nachteile die du hast wenn du es per hand nachbaust.

Und zu der überheblichkeit, ich bin lediglich davon ausgegangen das du etwas machen willst, weil du nicht weist wie es besser geht, oder nicht weisst warum es eine dumme Idee ist. Und vielleicht ist das überheblich, aber ich war vor ein paar jahren auch an ähnlichen punkten, lieber selbst machen als ne fertige, bessere lösung zu nehmen. Ich denke einfach das der grund warum du nicht sowas wie AppImage benutzen willst, ganz einfach ist das du keine Ahnung davon hast was das ist. Wenn ich falsch liege, sag mir doch bitte warum du dich gegen alle der x tausend etablierten Lösungen entschieden hast (gibt ja nicht nur AppImage und Docker, sondern noch flatpack, snap, etc.). Ich höre immer gerne gute gründe für etwas was ich bislang als schlechte idee gehalten habe. Aber bislang klang alles von dir nach "mir egal ich machs so wie ichs immer gemacht hab..." und das ist nunmal kein grund

Außerdem, das du kategorisch meine antwort ablehnst, weil da nicht lazarus drin steht, obwohl dein problem kein lazarus problem ist, und dir nicht mal die mühe machst das zu überprüfen indem du "LD_LIBRARY_PATH lazarus" googlest (wobei du dann den FPC wiki eintrag gefunden hättest der dir gesagt hat das das so stimmt was ich geschrieben hab), ist mMn. ziemlich überheblich von dir.
Das "wie ich es unter Windows schon seit 20 Jahren mache" strotzt auch komplett vor überheblichkeit. Wenn du dir nicht vorstellen kannst das seit 20 jahren jemand ne bessere technologie entwickelt hat, will ich eigentlich keine anwendung anfassen die du gebaut hast. Wahrscheinlich denkst du auch das verschlüsselung wie HTTPS nicht benötigt wird, weil wurde ja vor 20 jahren noch kaum eingesetzt.

Ralf hat geschrieben:Vor 20 Jahren waren die grundsätzlichen Aspekte der Softwareentwicklung die selben wie heute...
Schwarze Magie war damals genauso wenig im Spiel wie heute...
Komische Ansichten bzw. Wahrnehmungen hast Du...

Ähm nein? MDD z.B. ist heute praktisch standard und war vor 20 jahren kaum benutzt. DSL's im allgemeinen sind aktuell sehr beliebt sowie Standardisierte entwicklung (CMMI, etc.). Standardisierung steigert nachweislich die softwarequalität. In vielen deutschen unternehmen wird das noch nicht gemacht, wie z.B. in Indien, ist aber grade für größere software immer mehr im kommen.
Und falls es dir nicht aufgefallen ist, das ist genau worum es geht. Es gibt standardisierte einfache wege, die von millionen leuten täglich benutzt werden, getestet werden, und nur mit dem ziel entwickelt werden es so einfach und gleichmäßig wie möglich zu machen, und du gehst hin und sagst: "Ich machs selbst, denn ich kann das besser als die Experten, die den lieben langen tag nix anderes machen als drüber nachzudenken wie man das am besten machen kann".
Das thema hier ist genau das worin sich die Softwareentwicklung heute und vor 20 jahren am meisten unterscheidet. Wir haben software wie AppImage oder Docker, deren einziger job es ist die probleme du selbst fixen willst, zu beheben. Gebaut von Experten die sich nur damit beschäftigen was die beste möglichkeit ist das zu machen. Das gesammte Geschäftsmodell von Docker ist es, einen mechanismus anzubieten um software so einfach und schnell wie möglich zu deployen. Sowohl für die Entwickler als auch Nutzer. Wenn du behauptest du kannst das besser, schön, glaub ich dir aber nicht!

Ralf hat geschrieben:Dass erfahrene Leute keine große Lust haben langweilige Anfängerfragen zu beantworten, kann ich absolut verstehen....
So gibt es Leute die keine Lust haben auf meine Frage zu antworten und Leute die das auch nicht wissen.
Und dann gibt es noch die anderen... wo es schwer ist zu erkennen was die Motivation ist....

Auf die gefahr hin mich zu wiederholen, ich hab auf deine frage geantwortet, wenn dus nicht verstehen kannst, nicht mein problem. Und klar ich programmiere erst seit 12 jahren, aber ich würde trozdem sagen das mit 25 und fast abgeschlossenen Master-Informatikstudium ich doch ein bisschen ahnung habe. Zumindest wenn es um so sachen geht wie das wonach du fragst (also wie Linux funktioniert). Gibt ne ganze menge dinge die ich nicht weiß. Aber Linux internals, deployment von anwendungen und das ELF format gehören zu den sachen von denen ich mittlerweile relativ viel ahnung hab.

Ralf hat geschrieben:Es reicht doch schon ein Grund, oder nicht?
Obwohl beide Gründe schon nicht praxisfern sind, gibt es noch mehr Gründe...
Der zweite Grund ist im beruflichen Umfeld fast Standard, die Leute haben KEINE Installationsrechte, weswegen es auch tausende Pocket-Versionen mancher Software gibt.
Unzählige Tools von Fernwartung bis hin zu anderen Helferlein..... sie haben alle gemein, dass man sie einfach irgendwo hin kopiert oder auspackt und sie starten kann.
Einige Dateimanager und viele andere ähnliche Tools funktionieren auch z. B. schon seit mehr als 20 Jahren so, dass man einfach das Programmverzeichnis irgendwo hin kopiert (auch auf anderen Rechnern) und sie laufen direkt...

Genau dafür gibt es sachen wie AppImage oder Docker. Mit denen kannst du das ganze voll automatisiert gegen die aktuellste version der dependencies bauen lassen und deployen. Die kümmern sich um alles. Wie gesagt es gibt bessere Lösungen dafür.

Ralf hat geschrieben:Allerdings kenne ich das in der Tat von Windows nur in diesem Umfang so.
Ich kann nicht sehen und verstehen, was daran nun schlecht sein sollte. Sie sind DESWEGEN so beliebt, weil sie einfach direkt funktionieren.

Das hatte auch mit meiner Frage zu tun: Geht das nicht "einfach" auch unter Linux so? Ohne Scripte und Docker und andere riesige Verbiegungen auf OS-Ebene?
Ich frage nach dem WIE und nicht nach Philosophien...

Doch es geht, und ich habe dir hier schon zum dritten mal gesagt wie!

Und das es unter windows so schön funktioniert, klar als endnutzer sieht das elegant aus, DLL hell ist aber technisch ein riesen problem, und einer der gründe warum MS es bei .Not versucht zu verhindern, und warum sie angefangen haben wichtige libraries wie die OpenSSL mittlerweile im system mitzuliefern. Damit grade nicht jeder seine eigene version mitbringt

Ralf hat geschrieben:Viel zu kompliziert das alles....
Nicht meine Welt... und schon gar nicht mein Bestreben.

Docker macht alles einfacher. Ich will MySQL einen server hosten:
Code: Alles auswählen
docker run mysql:latest

Bonus punkte für vollständiges automatisches Deploy mit CI über gitlab. Du pusht deinen code ins git, keine stunde später ist das update verfügbar über docker für jedermann zum runterladen und benutzen. Keine probleme für, kein installieren. So einfach ist nicht mal MacOSX Drag to Install.
Oder für das was du machen willst ist AppImage von canonical wahrscheinlich das richte, einfach downloaden, doppelklick drauf, alles läuft, ohne das irgendwas zusätzlich installiert werden muss

PS: wenn du das so umsetzt wie du willst musst du aber auch konsequent sein, wenn du QT benutzt, der Nutzer aber ein frisches Ubuntu mit gnome hat, wird die anwendung nicht laufen, wenn du GTK benutzt und der nutzer ein frisches KDE arch hat, ists genau anders rum.
Du musst also mindestens noch das widgetset mitliefern. Wenn die wayland benutzen, du aber gtk für x11 mitlieferst, geht das natürlich auch nicht, du musst also noch x11 mitliefern. Und zack hast du 2-5 GB anwendungsbundle
Ich hoffe dir wird langsam klar wie absurd das ist!
Warf
 
Beiträge: 1343
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: MacOS | Win 10 | Linux | 
CPU-Target: x86_64
Nach oben

Beitragvon Ralf » 19. Dez 2019, 15:28 Re: Library im Programmverzeichnis

Warf hat geschrieben:
Ich bin beleidigt weil du mir unterstellst deine Frage nicht beantwortet zu haben und dann so tun als wenn meine antwort nicht valide ist. Ich hab dir genau gegeben wonach du gefragt hast, einen weg die so mitzuliefern. Das ist nur minimal besser als mich als lügner zu bezeichnen. Man braucht keine Beleidigungen um beleidigt zu sein. Im Gegenteil, Beleidigungen gehen mir am arsch vorbei. Wenn jemand aber behauptet ich hätte was gesagt was ich nicht getan hab (oder ich hätte eine frage nicht beantwortet, obwohl ich es klar getan hab) bin ich nunmal beleidigt.


.... ein Exkurs über "richtig" beleidigt sein ....
Die Wahrnehmungsebenen sind schon manchmal krass unterschiedlich.. :wink:

Ich hab dir genau gegeben wonach du gefragt hast,...

Okay ich glaube Dir, dass Du das denkst.... und du meine Frage vielleicht so verstanden hast, jedoch fragte ich eindeutig (äquivalent zu Windows), ob man einfach das Lazarusprogramm dazu veranlassen kann, auch die Library aus dem aktuellen Programmverzeichnis zu laden und nicht danach, was Du davon hältst oder was alles dagegen spricht und welche Tricks (AppImage, Docker, Scripte, etc.) es alles gibt. Auch hatte ich nicht nach modernen Entwicklungskonzepten und Fachbegriffen (MDD, DSL, CMMI, etc.) gefragt....
Doch unabhängig davon, dennoch Danke für Deine Mühe die Du Dir gemacht hast!

Das Du als IT-Master davon eine Menge kennst bezweifel ich nicht.... doch hat mich das in diesem Kontext nicht interessiert.... sondern schlicht und einfach die Lazarusfrage, ob ich das Programm (nur das Programm) dazu bringen kann, die lokal abgelegte Library zu laden. Es hätte ja sein können, dass es irgendwelche Compilerschalter gibt oder einen Pascal-Code, der dies ermöglicht.... ohne Hampelei ausserhalb des Programmes (eben wie unter Windows).

Auch will ich nicht Docker oder andere Frameworks, sondern einfach ein Lazarus-Programm starten ohne vorherige Installation.
Optional: und wenn da keine Lib ist, dann nimmt es halt die aus /usr/lib.
Das ist doch ein einfach nachvollziehbarer Ansatz... dachte ich jedenfalls.

Ich stelle nicht in Abrede, dass es bei komplexeren Programmen sinnvoll ist sich anderer Konzepte zu bedienen.... doch bei kleinen Tools (ich rede von 10-15 MB und nicht wie in deinen Ausführungen von 2-5 GB) finde ich es meist schlicht unnötig.
Updates und Bugfixes muss ich dann natürlich liefern...
Es ist ja nicht meine alleinige Meinung, viele solcher (Windows) Programme kennt doch jeder... daher verstehe ich die Diskussion darüber nur sehr eingeschränkt.

Zur Erinnerung; ich weiß das Linux anders aufgebaut ist als Windows, DESWEGEN fragte ich danach, ob man es diesbezüglich zum Umdenken zwingen kann.
Natürlich könnte ich das auch für Linux und für Windows unterschiedlich handeln, doch auch wenn ich dazu vielleicht gezwungen werde, das finde ich jedenfalls nicht so schick...

(Lib)Konflikte heutzutage nicht mehr real?
Die Vorteile die Libs aus dem Repositories nachzuinstallieren ist schon klar (Sicherheits- und Bugfixes), doch was ist mit (Versions)Konflikten, wie ich sie schon zig mal erlebt habe, wenn man mit global veröffentlichten (System32 bei Windows) Libraries zu tun hatte. Ich hatte z. B. im Delphiprogramm eine Grafiklib ausgeliefert, welche auch ein anderer Entwickler ebenfalls benutzte. Seine Version war neuer und ein Funktionsaufruf in der Lib hatte nun einen Parameter mehr als meine benötigte (ältere) Version.
Peng... schon läuft mein Programm nicht mehr. Wird ein (manueller) Downgrade gemacht (was bei "normalen" Anwendern sehr unwahrscheinlich und unüblich ist), dann läuft das andere Programm nicht mehr....
Und; nicht jedes Repository stellt die selben Versionen bereit... wie soll ich das Chaos denn beherrschen? Ich denke, nur wenn ich die selber liefere kann ich sicher sein die richtige Version zu haben?

Ich bin nicht sicher wie man das noch abfangen könnte? Klar könnte man die Versionsnr der Lib abfragen (die VersionNr. ist in Windows eine Pflichtangabe soweit ich weiß, unter Linux jedoch nicht), doch auch wenn ich die Missere im Vorfeld erkenne, was nun?

Vielleicht ist das Beispiel mit der sqlite3.so ein schlechtes Beispiel, weil die Entwickler nicht so etwas verrücktes machen wie Funktionsparameter ändern ... doch ob die in 10 Jahren immer noch so kompatible ist?

Ich habe ein Programm von jemanden, welches auf Java basiert. Läuft seit meinem Umstieg von Ubuntu 16.04 auf Ubuntu 18.04 nicht mehr. Habe andere Java Versionen nachinstalliert..... löppt trotzdem nicht mehr. Was genau das Problem ist weiß keiner (nur das es ein Java-Problem ist).
Natürlich liefert er NICHT die Runtimes mit... und das ist nur ein Beispiel von vielen. Deswegen u. a. habe ich auch keine Lust auf Java und ähnlich gestrickten Dingen.

Ich habe jetzt nochmal erläutert, was mich zu der Überlegung bewegt, die Libs selbst mit zu liefern... optimal mit der Option AUCH die Systemweiten nutzen zu können (wenn keine lokale da ist).
Natürlich nicht bei jedem Projekt... doch bei manchen macht es einfach nach meiner Erfahrung Sinn.

Und sei nicht wieder beleidigt, weil ich Deine Ausführungen ins Reich der modernen IT-Theorie nicht unreflektiert übernehmen mag, was nicht bedeutet, dass ich es nicht interessant finden würde was Du dazu zu sagen hast.... ;)
Doch ich bleibe dabei, dass es einfach nice ist ein ausführbares Programm anzuklicken und es löppt direkt... ohne vorherige Installation. Und es "schön" zu installieren (mit Menüeinträgen im OS, etc.) ist ja optional immer noch möglich.
Kubuntu 18.04
Ralf
 
Beiträge: 45
Registriert: 29. Jan 2014, 18:31
OS, Lazarus, FPC: Ubuntu 18.04 LTS (L 2.0.6 FPC 3.3.1) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Warf » 19. Dez 2019, 16:07 Re: Library im Programmverzeichnis

Ralf hat geschrieben:Doch ich bleibe dabei, dass es einfach nice ist ein ausführbares Programm anzuklicken und es löppt direkt... ohne vorherige Installation. Und es "schön" zu installieren (mit Menüeinträgen im OS, etc.) ist ja optional immer noch möglich.


Genau das bietet AppImage, braucht keine vorinstallierte software. Auf jeder größeren Linux distro kannst du einfach ein AppImage per doppelklick ausführen. Die Idee dabei ist das AppImage alles mitliefert, gibt auch programme um automatisch nach updates zu suchen (für dependencies und die anwendung). Du musst also um die anwendung weiter zu geben, einfach die .AppImage datei rüber ziehen und der nutzer kann es dann mit doppelklick ausführen.

Von allen deine ausführungen kommt es mir so vor als wölltest du genau das was AppImage dir liefert, nur halt selbst gebaut

Aber was ich nicht verstehe ist dann, was ist das problem mit dem bash script? ich hab das grade mal ausprobiert, funktioniert super. Kann damit per doppelklick das programm ausführen sodass es libs aus dem aktuellen verzeichnis laden kann.

Wenn du es alles in einer anwedung machen willst, kannst du es auch so machen:
1. Beim start überprüfen ob der richtige pfad in LD_LIBRARY_PATH liegt
2. wenn ja, mach normal weiter
3. wenn nein, starte das programm neu mit der environment variable gesetzt (TProcess.Environment, oder über ne shell starten, z.b. via fpsystem)

Um es mal ganz simpel zu schreiben, in das erste formload (oder sogar in die .lpr datei)
Code: Alles auswählen
var
  EnvVars: TStringList;
begin
  EnvVars := TStringList.Create;
  try
    Application.GetEnvironmentList(EnvVars);
    if pos(EnvVars.Values['LD_LIBRARY_PATH'], ExtractFilePath(ParamStr(0))) <= 0 then
    begin
      with TProcess.Create(nil) do
      try
        Executable = ParamStr(0);
        Environment := EnvVars;
        Environment.Values['LD_LIBRARY_PATH'] := Environment.Values['LD_LIBRARY_PATH'] + ':' + ExtractFilePath(ParamStr(0));
        Execute;
      finally
        Free;
      end
      Application.Terminate;
    end;
  finally
    EnvVars.Free;
  end;


Nicht getestet, aber ich hoffe die Idee kommt rüber.

(Lib)Konflikte heutzutage nicht mehr real?
Die Vorteile die Libs aus dem Repositories nachzuinstallieren ist schon klar (Sicherheits- und Bugfixes), doch was ist mit (Versions)Konflikten, wie ich sie schon zig mal erlebt habe, wenn man mit global veröffentlichten (System32 bei Windows) Libraries zu tun hatte. Ich hatte z. B. im Delphiprogramm eine Grafiklib ausgeliefert, welche auch ein anderer Entwickler ebenfalls benutzte. Seine Version war neuer und ein Funktionsaufruf in der Lib hatte nun einen Parameter mehr als meine benötigte (ältere) Version.
Peng... schon läuft mein Programm nicht mehr. Wird ein (manueller) Downgrade gemacht (was bei "normalen" Anwendern sehr unwahrscheinlich und unüblich ist), dann läuft das andere Programm nicht mehr....
Und; nicht jedes Repository stellt die selben Versionen bereit... wie soll ich das Chaos denn beherrschen? Ich denke, nur wenn ich die selber liefere kann ich sicher sein die richtige Version zu haben?


Gibt verschiedene ansätze. Unter Linux kann man über den paketmanager verschiedene versionen laden, und dann gegen die entspreichende version linken (die ist dann libName.so.version benannt). Unter windows kann man mit .Net auch genau angeben gegen welche version man arbeiten will, da sucht das .Net dann selbst die richtige raus wenn mehrere vorhanden sind. Gibt mehrere ansätze. persönlich bin ich natürlich (wie schon erwähnt) ein fan von docker oder AppImage, da man da die korrekte version aus den Repos installieren kann, aber trozdem garantieren kann das es nicht mit dem zielsystem interargiert
Warf
 
Beiträge: 1343
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: MacOS | Win 10 | Linux | 
CPU-Target: x86_64
Nach oben

Beitragvon Ralf » 19. Dez 2019, 18:12 Re: Library im Programmverzeichnis

Vielen Dank, damit komme ich meinen diesbezüglichen Vorstellungen schon wesentlich näher.

Warf hat geschrieben:
Genau das bietet AppImage, braucht keine vorinstallierte software. Auf jeder größeren Linux distro kannst du einfach ein AppImage per doppelklick ausführen. Die Idee dabei ist das AppImage alles mitliefert, gibt auch programme um automatisch nach updates zu suchen (für dependencies und die anwendung). Du musst also um die anwendung weiter zu geben, einfach die .AppImage datei rüber ziehen und der nutzer kann es dann mit doppelklick ausführen.

Von allen deine ausführungen kommt es mir so vor als wölltest du genau das was AppImage dir liefert, nur halt selbst gebaut


AppImage ist sehr interessant und ich schaue mir das sicherlich auch noch genauer an, jedoch ist es schon noch ein "Container" und ich muss ein "Packet" schnüren... usw.
Mein Ansatz ist, dass ich mich erst mal nicht festlegen muss, wie ich das Programm verteile... im schlimmsten Fall schicke ich dem Empfänger die Dateien (gfs. als ZIP) per Email mit der Anweisung sie irgendwo hin zu kopieren und das Programm zu starten....
Um die Aspekte wie Verteilung, Installation, Updates, usw. kann ich mich später kümmern.... dennoch soll das Programm von Anfang an funktionieren, sprich aufrufbar sein. Auch brauche ich mich nicht festlegen, ob ich die Lib('s) mitliefere (was ich in der Testphase vielleicht machen würde)... ich kann sie später auch über alternative Wege verfügbar machen...
Ich empfinde das flexibler für mich. Vielleicht bin ich auch einfach nur altmodisch.... so what.

Warf hat geschrieben:Aber was ich nicht verstehe ist dann, was ist das problem mit dem bash script? ich hab das grade mal ausprobiert, funktioniert super. Kann damit per doppelklick das programm ausführen sodass es libs aus dem aktuellen verzeichnis laden kann.


Ich hab damit KEIN Problem. Habe es auch eben mal getestet, funktioniert.... danke auch dafür!
Doch das ist dennoch für den einfachen Anwender (ich rede nicht von anderen IT'lern oder Nerds die das sofort blicken) eine ausführbare Datei mehr und somit auch eine Fehlerquelle mehr (Ausführbarkeit usw.).
Doch es wäre auch ein akzeptabler Workaround für die Übergangszeit.

Warf hat geschrieben:Wenn du es alles in einer anwedung machen willst, kannst du es auch so machen:
1. Beim start überprüfen ob der richtige pfad in LD_LIBRARY_PATH liegt
2. wenn ja, mach normal weiter
3. wenn nein, starte das programm neu mit der environment variable gesetzt (TProcess.Environment, oder über ne shell starten, z.b. via fpsystem)

Um es mal ganz simpel zu schreiben, in das erste formload (oder sogar in die .lpr datei)
Code: Alles auswählen
var
  EnvVars: TStringList;
begin
  EnvVars := TStringList.Create;
  try
    Application.GetEnvironmentList(EnvVars);
    if pos(EnvVars.Values['LD_LIBRARY_PATH'], ExtractFilePath(ParamStr(0))) <= 0 then
    begin
      with TProcess.Create(nil) do
      try
        Executable = ParamStr(0);
        Environment := EnvVars;
        Environment.Values['LD_LIBRARY_PATH'] := Environment.Values['LD_LIBRARY_PATH'] + ':' + ExtractFilePath(ParamStr(0));
        Execute;
      finally
        Free;
      end
      Application.Terminate;
    end;
  finally
    EnvVars.Free;
  end;


Nicht getestet, aber ich hoffe die Idee kommt rüber.


Das wäre super.
Ich werde das später noch testen und hoffe dass es löppt...

Zumindest in einem alten Post schreibt der "Pascal-Gurru" dass es nicht geht (Linux es generell nicht zulässt).... doch der Post ist auch schon wieder arg in die Jahre gekommen.... ;)
https://forum.lazarus.freepascal.org/index.php?topic=15249.0


Warf hat geschrieben:Gibt verschiedene ansätze. Unter Linux kann man über den paketmanager verschiedene versionen laden, und dann gegen die entspreichende version linken (die ist dann libName.so.version benannt). Unter windows kann man mit .Net auch genau angeben gegen welche version man arbeiten will, da sucht das .Net dann selbst die richtige raus wenn mehrere vorhanden sind. Gibt mehrere ansätze. persönlich bin ich natürlich (wie schon erwähnt) ein fan von docker oder AppImage, da man da die korrekte version aus den Repos installieren kann, aber trozdem garantieren kann das es nicht mit dem zielsystem interargiert


Nun, werde mir beides noch näher anschauen und vielleicht finde ich auch noch eine native Variante das Lib-Chaos in den Griff zu bekommen. Denn es gibt ja in /usr/lib z. B. nur eine libsqlite3.so als symbolischen Link auf eine bestimmte Version.... doch das sollte ich ja nicht verändern... um nicht andere Programme aus dem Tritt zu bringen...

Danke für alle Hinweise!
Kubuntu 18.04
Ralf
 
Beiträge: 45
Registriert: 29. Jan 2014, 18:31
OS, Lazarus, FPC: Ubuntu 18.04 LTS (L 2.0.6 FPC 3.3.1) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Warf » 19. Dez 2019, 19:02 Re: Library im Programmverzeichnis

Ralf hat geschrieben:Ich hab damit KEIN Problem. Habe es auch eben mal getestet, funktioniert.... danke auch dafür!
Doch das ist dennoch für den einfachen Anwender (ich rede nicht von anderen IT'lern oder Nerds die das sofort blicken) eine ausführbare Datei mehr und somit auch eine Fehlerquelle mehr (Ausführbarkeit usw.).
Doch es wäre auch ein akzeptabler Workaround für die Übergangszeit.

Man kann noch einen trick machen, das script übergibt ein Programm parameter an das programm, und wenn das programm nicht diesen erhält, startet es sich selbst über das script neu. Somit ist egal was man anklickt, es wird immer das richtige ausgeführt. Solang es niemanden stört das es mehrere dateien gibt, sollte das so kein problem darstellen

Beispiel bash script:
Code: Alles auswählen
#!/bin/bash
 
PDIR=$(dirname $0)
LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:$(realpath ${PDIR})" ${PDIR}/programname 1234567890 $@

Dann am anfang der lpr (noch bevor die Application initialisiert wird:
Code: Alles auswählen
if (ParamCount < 1) Or (ParamStr(1) <> '1234567890') then
begin
  with TProcess.Create(nil) do
  try
    Executable := ParamStr(0) + '.run'; // angenommen das script hat den selben namen + .run
    Execute;
  finally
    Free;
  end;
Exit; // programm beenden bevor es initialisiert
end;


Ich glaub lazarus macht das so ähnlich, eigentlich soll man die IDE über startlazarus.exe starten, über lazarus.exe geht es aber auch. Ohne jetzt in den source zu schauen kann ich mir vorstellen das sie es so ähnlich machen (muss aber natürlich nicht sein)

Ralf hat geschrieben:Zumindest in einem alten Post schreibt der "Pascal-Gurru" dass es nicht geht (Linux es generell nicht zulässt).... doch der Post ist auch schon wieder arg in die Jahre gekommen.... ;)
https://forum.lazarus.freepascal.org/index.php?topic=15249.0


Ja du kannst zur laufzeit die environment variablen nicht ändern. Aber nichts hält dich ab einfach das programm mit neuen environment variablen nochmal zu starten, und das alte dann einfach zu beenden.
Der Grund dafür ist technischer Natur. Beim programm start werden die Variablen auf den Stack geschrieben, bevor die Mainfunktion aufgerufen wird. Durch die natur vom stack ist es nicht möglich die größe von variablen drauf zu verändern, also kannst du die Umgebungsvariablen nicht vergrößern (außer du willst was anderes überschreiben, das geht dann natürlich).
Der code von mir startet sich selbst neu mit einem neuen environment. Wenn ich nicht irgendwo tippfehler drin hab sollte das so funktionieren. Gibt aber noch alternativen, so kannst du z.b. stattdessen ein temporäres bash script erstellen, wie das was ich geschrieben hab. Oder du kannst mit fpSystem arbeiten (auch wenn das extrem hässlich ist, und sehr unsicher):
Code: Alles auswählen
fpSystem('LD_LIBRARY_PATH=$LD_LIBRARY_PATH:' + ExtractFilePath(ParamStr(0)) + ' '+ ParamStr(0));
Application.Terminate;

Gibt also mehr als genug möglichkeiten. Ich denke aber das das mit TProcess so funktionieren sollte

Ralf hat geschrieben:Nun, werde mir beides noch näher anschauen und vielleicht finde ich auch noch eine native Variante das Lib-Chaos in den Griff zu bekommen. Denn es gibt ja in /usr/lib z. B. nur eine libsqlite3.so als symbolischen Link auf eine bestimmte Version.... doch das sollte ich ja nicht verändern... um nicht andere Programme aus dem Tritt zu bringen...

Danke für alle Hinweise!

Für die Uni hab ich ein Java projekt, das zum kompilieren JDK 8 benötigt, für die erste hälfte aber nur auf Arch Linux kompiliert, für die zweite hälfte aber 32 bit JDK benötigt, was es ja nicht auf arch gibt (Arch ist 64 bit only). Das ist ein richtiges dependency gemische. Dafür ist docker genial. Ich share das build verzeichnis einfach zwischen zwei docker images, ein 64 bit Arch für die erste hälfte und ein 32 bit Debian für die zweite hälfte. Ansonsten wär das unter Linux überhaupt nicht möglich zu bauen (unter Windows geht alles mit einer version, hab aber kein Windows auf dem Laptop für die Uni).
Immer eine Frage der werkzeuge, Docker ist großartig um solche dependency gemengele klar zu halten, dabei trozdem mit caching sehr speicher effizient zu sein, ist aber beschissen für GUI anwendungen. AppImage hat praktisch zwei ziele. 1. Programme (mit fokus auf GUI) einfach benutzbar zu machen, installieren ist rüberkopieren, deinstallieren ist löschen, und 2. Anwendungen auf allen Distros gleich laufen zu lassen (da verschiedene Paketmanager oft verschiedene namen für die pakete haben ist das ansonsten die hölle). Dafür ist AppImage recht groß, da es kein caching/sharing von bibliotheken zwischen den images erlaubt (im docker, wenn zwei images auf der selben basis aufbauen, wird die basis geshared, ist also nur einmal vorhanden).
Flatpak und Snap sind ähnlich zu AppImage, nur das die das Programm nochmal sandboxen (ähnlich zu docker), sodass das auf dem Host PC nichts kaputt machen kann, wobei Snap nur aus dem Snap repositories dependencies laden kann. Dafür hat snap einen Store über den man auch nicht freeware verkaufen kann.
Alles seine vor und Nachteile.
Warf
 
Beiträge: 1343
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: MacOS | Win 10 | Linux | 
CPU-Target: x86_64
Nach oben

Beitragvon Ralf » 20. Dez 2019, 17:08 Re: Library im Programmverzeichnis

Warf hat geschrieben:Wenn du es alles in einer anwedung machen willst, kannst du es auch so machen:
1. Beim start überprüfen ob der richtige pfad in LD_LIBRARY_PATH liegt
2. wenn ja, mach normal weiter
3. wenn nein, starte das programm neu mit der environment variable gesetzt (TProcess.Environment, oder über ne shell starten, z.b. via fpsystem)

Um es mal ganz simpel zu schreiben, in das erste formload (oder sogar in die .lpr datei)
Code: Alles auswählen
var
  EnvVars: TStringList;
begin
  EnvVars := TStringList.Create;
  try
    Application.GetEnvironmentList(EnvVars);
    if pos(EnvVars.Values['LD_LIBRARY_PATH'], ExtractFilePath(ParamStr(0))) <= 0 then
    begin
      with TProcess.Create(nil) do
      try
        Executable = ParamStr(0);
        Environment := EnvVars;
        Environment.Values['LD_LIBRARY_PATH'] := Environment.Values['LD_LIBRARY_PATH'] + ':' + ExtractFilePath(ParamStr(0));
        Execute;
      finally
        Free;
      end
      Application.Terminate;
    end;
  finally
    EnvVars.Free;
  end;


Nicht getestet, aber ich hoffe die Idee kommt rüber.



Ich habe den Ansatz verstanden und es in die .lpi gepackt (zuvor auch in onCreate der MainForm), doch die Routine ruft sich rekursiv so lange erneut auf, bis der RAM auseinander fliegt... :shock:
Debuggen kann ich das auch nur schwierig (landet kein zweites mal auf den Breakpoint)...

Sehe nicht den Denkfehler, denn für mich ist die Routine schon rund...

Was übersehe ich?
Kubuntu 18.04
Ralf
 
Beiträge: 45
Registriert: 29. Jan 2014, 18:31
OS, Lazarus, FPC: Ubuntu 18.04 LTS (L 2.0.6 FPC 3.3.1) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Warf » 20. Dez 2019, 17:53 Re: Library im Programmverzeichnis

Ein richtig dummer fehler: Die signatur von pos:
Code: Alles auswählen
function Pos(
  const substr: String;
  const s: String
):SizeInt;

Die beiden argumente sind vertauscht... Der hat also nach dem inhalt von LD_LIBRARY_PATH in ParamStr(0) gesucht statt anders rum

Eine funktionierende version is:
Code: Alles auswählen
var
  EnvVars: TStringList;
  i: Integer;
begin
  EnvVars := TStringList.Create;
  try
    for i:=1 to GetEnvironmentVariableCount do
      EnvVars.Add(GetEnvironmentString(i));
    if not EnvVars.Values['LD_LIBRARY_PATH'].contains(ExtractFilePath(ParamStr(0))) then
    begin
      EnvVars.Values['LD_LIBRARY_PATH'] := '%s:%s'.format(
          [ExtractFilePath(ParamStr(0)), EnvVars.Values['LD_LIBRARY_PATH']]);
      with TProcess.Create(nil) do
      try
        Executable := ParamStr(0);
        for i:=1 to ParamCount do
          Parameters.Add(ParamStr(i));
        Environment := EnvVars;
        Execute;
      finally
        Free;
      end;
      Exit;
    end;
  finally
    EnvVars.Free;
  end


Da ich hier jetzt aber Exit statt application.Terminate benutze funktioniert das nur ganz am anfang der LPR. Im FormLoad brauchst du natürlich Application.Terminate. Ich hab mal Application rausgenommen, da es damit auch für Anwendungen funktioniert die keine Application klasse haben (nicht alles ist ne Form Anwendung). Außerdem hab ich auch noch die Parameter hinzugefügt. Ich denke das sollte jetzt ne recht allgemeine funktionalität sein, die man in (fast) jedem projekt benutzen kann
Ich würds aber ins LPR stecken, da alle komponenten die du auf den Forms hast, eventuell ja schon die Bibliotheken brauchen. Das ist zwar noch nicht perfekt (immerhin gibts den initialiserungspart von Units der noch vorher läuft), sollte aber ausreichend sein
Warf
 
Beiträge: 1343
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: MacOS | Win 10 | Linux | 
CPU-Target: x86_64
Nach oben

Beitragvon Ralf » 20. Dez 2019, 20:26 Re: Library im Programmverzeichnis

Warf hat geschrieben:Die beiden argumente sind vertauscht... Der hat also nach dem inhalt von LD_LIBRARY_PATH in ParamStr(0) gesucht statt anders rum

Eine funktionierende version is:
(cut)

Da ich hier jetzt aber Exit statt application.Terminate benutze funktioniert das nur ganz am anfang der LPR. Im FormLoad brauchst du natürlich Application.Terminate. Ich hab mal Application rausgenommen, da es damit auch für Anwendungen funktioniert die keine Application klasse haben (nicht alles ist ne Form Anwendung). Außerdem hab ich auch noch die Parameter hinzugefügt. Ich denke das sollte jetzt ne recht allgemeine funktionalität sein, die man in (fast) jedem projekt benutzen kann
Ich würds aber ins LPR stecken, da alle komponenten die du auf den Forms hast, eventuell ja schon die Bibliotheken brauchen. Das ist zwar noch nicht perfekt (immerhin gibts den initialiserungspart von Units der noch vorher läuft), sollte aber ausreichend sein


Vielen Dank!
Das ist jetzt GENAU DAS was ich mir wünschte....
Jetzt kann ich die Routine mit einer Konstanten beliebig ein- und ausschalten und ein weiterer Test war direkt erfolgreich.
Unter meinem Ubuntu 18.04 löppt es schon mal 1a.

D. h. nicht, dass ich jetzt nie mehr auch "richtige" Verteilungskonzepte in Betracht ziehen werde.... denn bei größeren Projekten leuchtet es sogar mir ein, dass Q&D nicht immer die beste Lösung ist :wink:

Ich danke Dir nochmal... man merkt Dir den baldigen Master an... ich hätte da wohl noch einige Stunden länger dran rumgebastelt... :mrgreen:
Kubuntu 18.04
Ralf
 
Beiträge: 45
Registriert: 29. Jan 2014, 18:31
OS, Lazarus, FPC: Ubuntu 18.04 LTS (L 2.0.6 FPC 3.3.1) | 
CPU-Target: 64Bit
Nach oben

• Themenende •

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste

porpoises-institution
accuracy-worried