Hallo,
ich will GUI mit wxWidgets erstellen. Zur Zeit arbeite ich mich in diese
Thematik ein. Meine IDE ist unter Linux eingerichtet. Will ich ein
Programmchen auch unter Windwows verwenden, so kann ich problemlos eine
exe-Datei (mit dem MinGW-Cross-Compiler) erstellen.
So, dann kopiere ich diese exe-Datei nach Windows und beim Starten
erhalte ich eine Fehlermeldung. Weil die Libs fehlen ;-)
Wie geht man bei solchen Sachen denn vor? Statisch linken? Also
wxWidgets kann ich statisch linken aber glibc? Die beiden Flags
1
-static-libgcc-static-libstdc++
habe ich hinzugefügt, aber sie bringen anscheinend nichts.
Hier steht sogar, dass man glibc nicht statisch linken kann:
https://stackoverflow.com/questions/26304531/compiling-with-static-libgcc-static-libstdc-still-results-in-dynamic-depende
Stimmt das so?
Und wenn ich dynamisch linke, dann müssen ja alle Libraries auf dem
Zielrechner vorhanden sein. D.h. man muss dann dem Anwender sagen
"Lieber Endanwender, dieses Programm verwendet libc- und
wxWidgets-Libraries. Also installiere erst mal alle diese Dateien, setze
alle Path-Variable korrekt und wenn du alles richtig gemacht hast, dann
darfst du meine "Hello, World"-Anwendung starten". Und wenn jemand dann
boost, libc, wxWidgets und noch fünf weitere Libs verwendet? Kein
normaler Mensch würde doch so eine Anwendung zum Laufen bringen (wenn er
alle Libs selbst installieren muss).
Momentan habe einfach alle dll-Dateien mit dem Programm im gleichen
Ordner abgelegt. So funktioniert's ja.
Wie geht ihr bei solchen Sachen vor?
Danke und frohe Weihnachten!
Und legt man dann die benötigten Bibliotheken so einem Installer
einfach bei? Dann kann ich diese im Prinzip auch einem zip-File beilegen
(wie jetzt).
Bei mir wird z.B. libgcc benötigt. Also GPL-Lizenz. Dann muss ich dazu
- Lizenztext
- Copyrightvermerk
- Haftungsausschluss
- Quelltext (zumindest einen Verweis)
mitliefern??? Denn ich verbreite ja dann GPL-lizenzierte Software
(zumindest ein Teil davon - libgcc)
Nein, der Installer kopiert sie (die Lizenzinfos) mit ins
Zielverzeichnis. Kann die Lizemzinfos auf Wunsch während der
Installation anzeigen oder eine Verknüpfung zu den Textfiles anlegen.
Natürlich kopiert er auch die benötigten libs gleich mit. Der Installer
erzeugt eine einzige install.exe die alles enthält um die Anwendung
lauffähig auf dem Zielsystems zu installieren.
Schau dir den empfohlenden Installer mal an. Der ist super einfach zu
nutzen, bietet bei Bedarf aber auch sehr viele erweiterte Möglichkeiten.
Dann nimm halt VC unter Windows. Alle meine Anwendungen die ich bisher
mit wxWindows bis wxWidgets geschrieben haben bestehen genua aus einer
einzigen exe ohne weitere dlls oder libs. Ich persönlich hasse
Anwendungen die man nicht einfach durch kopieren zum Laufen kriegt. Klar
für Plugins o.ä. kommt man dann halt ohne dlls nicht aus, aber für
einfache Anwendungen ist das nicht nötig. Auch die paar Byte die man
durch einen modularen Ansatz mit Abhängigkeiten spart wiegen die
Nachteile nicht auf.
lalala schrieb:> Libgcc hat doch die Ausnahme, oder?
Für's Linken. Aber nicht für die Weitergabe der Datei selbst.
https://www.gnu.org/licenses/gpl-faq.en.html#LGPLStaticVsDynamic
(2) If you dynamically link against an LGPLed library already present on
the user's computer, you need not convey the library's source. On the
other hand, if you yourself convey the executable LGPLed library along
with your application, whether linked with statically or dynamically,
you must also convey the library's sources, in one of the ways for which
the LGPL provides.
temp schrieb:> bestehen genua aus einer> einzigen exe ohne weitere dlls oder libs.
Wenn man nur die Funktionen aus dem wxWidgets-Bundle nimmt und statisch
linkt, dann ist so etwas wohl möglich. Aber im Prinzip könnte man auch
die Libs so mit dem Programm weitergeben. wxWidgets hat ja hier eine
Abweichung von LGPL wenn ich es richtig verstanden habe.
Benutzt man aber eine Lib, die unter LGPL (oder gar GPL) lizenziert
wurde, dann sieht es schon anders aus. Dann kommst sofort der Quellcode
in Frage. Und bei GPL wohl sogar der eigene.
zitter_ned_aso schrieb:> Wie geht ihr bei solchen Sachen vor?
So:
> Momentan habe einfach alle dll-Dateien mit dem Programm im gleichen> Ordner abgelegt. So funktioniert's ja.zitter_ned_aso schrieb:> Und legt man dann die benötigten Bibliotheken so einem Installer> einfach bei?
Der Installer installiert sie einfach mit.
> Dann kann ich diese im Prinzip auch einem zip-File beilegen> (wie jetzt).
Das macht aber nicht so Dinge wie z.B. Startmenü-Einträge anlegen oder
sicherstellen, dass alles in den richtigen Verzeichnissen liegt.
Ein Installer ist unter Windows mangels einer vernünftigen
Paketverwaltung noch die beste Variante.
Rolf M. schrieb:> Ein Installer ist unter Windows mangels einer vernünftigen> Paketverwaltung noch die beste Variante.
Naja, MSI von Microsoft ist ja wohl eine Paketverwaltung. Aber die
Nutzung macht keinen Spaß. Und was ich bei "professioneller" Software so
sehe zeigt mir das die Profis mit MSI auch oft überfordert sind.
Was hier noch nicht erwähnt wurde, der Installer bietet auch die
Möglichkeit die Software am Ende wieder rückstandsfrei zu entfernen.
Auch das liegt in deiner (zitter_ned_aso) Verantwortung als
Programmierer.
temp schrieb:> Dann nimm halt VC unter Windows. Alle meine Anwendungen die ich bisher> mit wxWindows bis wxWidgets geschrieben haben bestehen genua aus einer> einzigen exe ohne weitere dlls oder libs. Ich persönlich hasse> Anwendungen die man nicht einfach durch kopieren zum Laufen kriegt.
Und ich hasse es, wenn Softwarehersteller sich nicht um die
Sicherheitslücken in ihren Binaries kümmern, die sich nur eingeschlichen
haben, weil die Libraries statisch in das Binary gelinkt wurden.
Hätten sie die Library dynamisch gelinkt, dann hätte man zumindest eine
Chance durch austauschen der Library gegen eine neuere Version mit dem
Fix die Sicherheitslücke zu schließen.
Dynamisch Linken und die Libs mitliefern ist deswegen die bessere
Lösung.
Nano schrieb:> Und ich hasse es, wenn Softwarehersteller sich nicht um die> Sicherheitslücken in ihren Binaries kümmern, die sich nur eingeschlichen> haben, weil die Libraries statisch in das Binary gelinkt wurden.
Kleine Ergänzung damit es nicht missverstanden wird.
Das bezieht sich auf eventuelle Sicherheitslücken in der Lib, nicht im
eigenen Code.
Es ist leider erschreckend, dass viele Softwarehersteller sich gar nicht
mehr um die Sicherheitslücken in 3rd Party Libs, die sie für ihre
Software nutzen, kümmern, wenn ihre Software mal irgendwie läuft und an
den Kunden ausgeliefert wurde.
Muss man da dann selber ran, dann braucht man entweder den Objectcode
des Codes des Herstellers oder eben dynamisch gelinkte Libaries.
Genau für solche Fälle wurde die LGPL geschaffen, damit man Bugs in der
Lib selbst fixen kann.
Kleine Tools sollte man statisch linken
( und mit UPX ) laufzeit packen,
größere dynamisch linken und mit Installer
installieren um z.B. bei meheren Exen oder
DLLs Platz zu sparen.
mfg
Nano schrieb:> Hätten sie die Library dynamisch gelinkt, dann hätte man zumindest eine> Chance durch austauschen der Library gegen eine neuere Version mit dem> Fix die Sicherheitslücke zu schließen.
Und das funktioniert halt gerade unter Windows so herausragend gut.
Weil ja jede Anwendung ihre eigene Kopie der Libraries mitschleppt.
Weil es ja nichtmal eine funktionierende Softwareverwaltung unter
Windows gibt, die Abhängigkeiten abbildet und mit der man Libraries
zentral installieren könnte.
SCNR
clang und seine "runtime library" haben eine andere Lizenz als gcc.
Da scheint alles nicht so strikt zu sein (muss ich mich aber noch
einlesen).
Nano schrieb:> Genau für solche Fälle wurde die LGPL geschaffen, damit man Bugs in der> Lib selbst fixen kann.
Das kann ich nachvollziehen. Und diese Denkweise teile ich auch.
Aber ständig Quellcode für den Endanwender bereit zu halten? Denn
einfach einen Verweis auf die Originalseite vom GCC-Projekt wird laut
LGPL nicht akzeptiert. Man muss selbst eine Kopie haben und diese, bei
Bedarf / nach einer Nachfrage, nachliefern / zum Download bereit halten.
~Mercedes~ . schrieb:> ( und mit UPX ) laufzeit packen,
Damit die gesamte exe in den Speicher geladen werden muss.
Man kann ein 1GB AVI in den Datenbereich der exe linken und bei Bedarf
darauf zugreifen. Ist es allerdings mit UPX gepackt dann wird der 1GB
Hauptspeicher immer belegt.
UPX ist Müll mit dem unfähige Programmierer versuchen ihre Unfähigkeit
zu kaschieren.
Ausnahme sind evtl. irgendwelche kleinen standalone single exe Tools zum
direkten Web Download. Der schöne Nebeneffekt von UPX ist ja auch die
Prüfsumme.
Test meinte:
> UPX ist Müll mit dem unfähige Programmierer versuchen ihre Unfähigkeit> zu kaschieren.
Nana, das hab ich von ner exellenten Hexe gelernt! :-O ;-P
> Ausnahme sind evtl. irgendwelche kleinen standalone single exe Tools zum> direkten Web Download. Der schöne Nebeneffekt von UPX ist ja auch die> Prüfsumme.
Genau dies hab ich ja oben auch geschrieben.
Das Beste ist natürlich ein eigenes Library - Format,
etwa ein Single File System, woraus sich die Exe
dann die entsprechenden Files und Ressourcen holt.
Damit umschifft man dann die Nachteile von UPX.
mfg
zitter_ned_aso schrieb:> Aber ständig Quellcode für den Endanwender bereit zu halten?
Das Problem kann man meines Wissens nach umgehen, in dem man den
Quellcode gleich mitliefert.
Du musst meines Wissens nach ja nur einmal dafür sorgen, dass er den
Quellcode erhält, daraus würde ich keine Verpflichtung ableiten, das
ständig bereitzuhalten.
Letzteres muss man halt machen, wenn man den Quellcode der Lib nicht
mitliefert, dann könnte es jederzeit sein, dass er nach dem Quellcode
fragt.
Aber ich bin kein Anwalt, daher gebe ich auf das von mir gesagte keine
Gewähr.
Ergänzung:
Mitgelieferter Quellcode bläht halt leider das zip oder
Installationspaket auf, das ist der Nachteil daran.
Und wenn man es gleich in einen Unterordner installiert, dann frisst es
Speicherplatz auf dem Rechner des Kunden.
Wenn man den Quellcode zu Verfügung stellen muss könnte man ihn mit in
den Installer packen. Dann könnte ihn der Nutzer auf Wunsch bei der
Installation mit ins Zielverzeichnis kopieren lassen. -> Pflicht
erfüllt.
Oder man bietet den Source als Download
vom eigenen Webserver an, der auch gleichzeitig
das Programm regelmäßig updatet.
Wenn man mit dem Prog Geld verdient, ist
regelmäßiges Update sowiso Pflicht.
mfg
Nano schrieb:> Quellcode gleich mitliefert.> Du musst meines Wissens nach ja nur einmal dafür sorgen, dass er den> Quellcode erhält, daraus würde ich keine Verpflichtung ableiten, das> ständig bereitzuhalten.
Genau, die (L)GPL bietet beide Möglichkeiten, und man kann sich das
aussuchen. Und ständig bereithalten muss man es nicht, nur mindesten 3
Jahre. Und man muss es auch nicht zwingend zum Download anbietet. Wenn
einer nachfragt, reicht es, wenn man dem den Quellcode schickt. Das darf
übrigens auch z.B. auf einer CD per Post auf Kosten des Nachfragenden
sein.
zitter_ned_aso schrieb:> Aber ständig Quellcode für den Endanwender bereit zu halten? Denn> einfach einen Verweis auf die Originalseite vom GCC-Projekt wird laut> LGPL nicht akzeptiert. Man muss selbst eine Kopie haben und diese, bei> Bedarf / nach einer Nachfrage, nachliefern / zum Download bereit halten.
Du hast da wohl was missverstanden.
Wenn du an dem Bibliothek-Quelltext selber nichts veränderst, sondern
die Lib einfach so verwendest, wie sie von der Projektseite kommt, musst
du den Lib-Quelltext nicht selber bereithalten.
Wenn du aber einen Patch/Bugfix oder Zusatzfeature in eine (L)GPL'ed
Library reinprogrammierst, und deine verbesserte Library Version
verwendest/verbreitest, dann musst du den verbesserten Quelltext
vorhalten. Das geht übrigens am Besten, wenn man seine Patches einfach
upstream pusht.
Sobald sie da accepted sind, und dein Programm wieder mit der
Vanilla-Version kompiliert, bist du die GPL-Verpflichtungen auch wieder
los.
Was aber (gerade beim statisch Linken) sein kann, ist, dass du deinen
Applikations-Quelltext (oder zumindest Object-Files und Scripts zum
Linken) bereithalten musst, ohne den Quelltext der verwendeten
unveränderten GPL-Libs.
(Sinn: Der Endanwender muss die Option erhalten, deine Applikation auch
mit von ihm selber veränderten GPL-Bestandteilen zu verwenden.
Bei dynamisch gelinktem Binary kann er einfach selber die .DLL/.so
austauschen. Bei statisch gelinktem .EXE musst du dem Endanwender
äquivalente Optionen zur Verfügung stellen. Am Anwendungs-Quelltext muss
er deswegen keine Änderungen vornehmen können.)
OSSie schrieb:> Wenn du aber einen Patch/Bugfix oder Zusatzfeature in eine (L)GPL'ed> Library reinprogrammierst, und deine verbesserte Library Version> verwendest/verbreitest, dann musst du den verbesserten Quelltext> vorhalten. Das geht übrigens am Besten, wenn man seine Patches einfach> upstream pusht.>> Sobald sie da accepted sind, und dein Programm wieder mit der> Vanilla-Version kompiliert, bist du die GPL-Verpflichtungen auch wieder> los.
Das gilt nicht für Libs unter GPL, sondern nur unter LGPL. Nutzt man
eine Bibliothek unter den Bedingungen der GPL, muss bei Weitergabe des
eigenen Programms auch dessen Quellcode verfügbar gemacht werden.
> Was aber (gerade beim statisch Linken) sein kann, ist, dass du deinen> Applikations-Quelltext (oder zumindest Object-Files und Scripts zum> Linken) bereithalten musst, ohne den Quelltext der verwendeten> unveränderten GPL-Libs.
Auch hier: LGPL, nicht GPL. Und das kann nicht nur sein, sondern es
muss.
> (Sinn: Der Endanwender muss die Option erhalten, deine Applikation auch> mit von ihm selber veränderten GPL-Bestandteilen zu verwenden.> Bei dynamisch gelinktem Binary kann er einfach selber die .DLL/.so> austauschen. Bei statisch gelinktem .EXE musst du dem Endanwender> äquivalente Optionen zur Verfügung stellen. Am Anwendungs-Quelltext muss> er deswegen keine Änderungen vornehmen können.)
Was ich mich da immer frage: Was ist denn bei Hardware, deren Firmware
LGPL-Komponenten enthält? Beispiel: Bei meinem Auto war ein kleines
Heftchen mit den Lizenzen der Opensource-Komponenten dabei, die auf der
Telematik-Einheit verwendet werden. Auch im Menü gibt's einen Eintrag,
wo man sich eine Liste aller Komponenten anzeigen lassen kann. Da sind
auch LGPL-Sachen dabei. Ich frage mich aber nun, wie ich da diese
Komponente austauschen soll. Dazu müsste ich ja eigentlich die Firmware
in einer Form bekommen, in der diese Komponenten ausgetauscht werden
können und so, dass ich die neue Firmware irgendwie da drauf flashen
kann. Diese Möglichkeiten habe ich aber nicht. Ich komme an die Firmware
überhaupt nicht dran, zum Flashen muss sie vermutlich auch erst
irgendwie signiert werden. Ich habe nicht mal die Info, welche
Architektur das ist und was für einen Compiler man bräuchte. Ist das
nicht eigentlich eine Lizenzverletzung?