Forum: PC-Programmierung glibc + wxwidgets statisch linken oder Libraries mitschleppen?


von zitter_ned_aso (Gast)


Lesenswert?

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!

: Verschoben durch User
von test (Gast)


Lesenswert?

Dafür gibts Installer. Mein Tipp 
https://de.wikipedia.org/wiki/Inno_Setup

von zitter_ned_aso (Gast)


Lesenswert?

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)

von test (Gast)


Lesenswert?

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.

von lalala (Gast)


Lesenswert?


von temp (Gast)


Lesenswert?

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.

von zitter_ned_aso (Gast)


Lesenswert?

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.

von zitter_ned_aso (Gast)


Lesenswert?

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.

von Rolf M. (rmagnus)


Lesenswert?

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.

von test (Gast)


Lesenswert?

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.

von Nano (Gast)


Lesenswert?

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.

von Nano (Gast)


Lesenswert?

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.

von Lotta  . (mercedes)


Lesenswert?

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

von Sven P. (Gast)


Lesenswert?

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

von zitter_ned_aso (Gast)


Lesenswert?

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.

von test (Gast)


Lesenswert?

~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.

von Lotta  . (mercedes)


Lesenswert?

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

von Nano (Gast)


Lesenswert?

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.

von Nano (Gast)


Lesenswert?

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.

von test (Gast)


Lesenswert?

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.

von Lotta  . (mercedes)


Lesenswert?

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

von Rolf M. (rmagnus)


Lesenswert?

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.

von OSSie (Gast)


Lesenswert?

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.)

von Rolf M. (rmagnus)


Lesenswert?

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?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.