static bin
-
hallo!
wie erstelle ich für mein programm eine static bin, die es dem faulen user im prinzip ermöglicht, ohne weitere libs, die dependencies meines projekts sind, ein bereits kompiliertes projekt zu verwenden?
hab mein programm mit kdevelop erstellt.
die linker flags sind:
`curl-config --libs` `glib-config --libs` -lsmtp++ "libin1iparser.a"
d.h. dependencies wären: libsmtp++, libcurl, glib, und ein im projekt ordner befindliches libiniparser
da meine anwendung keine updates mit sich bringt, und es wirklich nur von wenigen leuten genutzt wird, soll darauf verzichtet werden, ein ebuild o.ä. zu erstellen. die user sollen es nur entpacken und starten können. keine optimierung oder anpassung ans system nötig! da es nun wirklich zu viel verlangt wäre, dass jeder die libs mühsam installiert, hab ich mir sagen lassen, dass sich das, was ich will, ne "plug and play" lösung, static bin nennt.
gleich mal bei google gesucht, wie ich sowas erstelle... aber leider nichts/kein tutorial gefunden.
daher frage ich nun mal bei Euch, wie sich sowas erstellen lässt für mein kdevelop c++ projekt.
danke
-
-static als GCC Option. Siehe GCC Manual
-
danke... vor wenigen minuten hab ichs doch noch bei google rausbekommen.
-
hallo nochmal!
das problem ist doch noch nicht so ganz gelöstauch wenn es nur warnungen sind:
/usr/lib/libcrypto.a(dso_dlfcn.o): In function
dlfcn\_load': dso_dlfcn.c:(.text+0x5c): warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking /usr/lib/libcurl.a(netrc.o): In function
Curl_parsenetrc':
netrc.c:(.text+0x342): warning: Using 'getpwuid' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/usr/lib/libcurl.a(hostip6.o): In functionCurl_getaddrinfo': hostip6.c:(.text+0x152): warning: Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking /test/libsmtp++-0.1.1/src/libsmtp++.a(inetsocket.o): In function
InetSocket::connect()':
inetsocket.cpp:(.text+0x30d): warning: Using 'gethostbyname' in statically linked applications requires at runtime the shared libraries from the glibc version used for linkingwas will g++ mir damit sagen?
bzw. was ist zu tun?
hab leider feststellen müssen, dass auf nem anderen rechner, wo die glib nicht installiert ist, die anwendung, obwohl sie nun auch laut ldd eine statisch binary ist, nicht so recht funktioniert. ist zwar ausführbar... aber bei verwendung der funktionen der libs, passieren dem programm malleuresdanke für Eure hilfe
-
ich habe es auch schon mal versucht, eine ausführbare Datei zu erstellen, sodass keine weiteren libs benötigt werden, und bin damit gescheitert.
Vielleicht schaffen wir es mit weiterer Unterstützung diesmal.
Wichtig ist erstmal, dass alle verwendeten libs als static, also
mit der Endung .a vorliegen.
Aber meines Wissens führt die compileroption -static nicht dazu, dass hinterher ein komplettes ausführbares Programm vorliegt. zumindest bei mir wollte er immer noch, d.h. beim Starten des Programms, irgendwelche libs haben.
-
lat ldd ist das ergebnis eine unabhängige anwendung. das klappt also schon...
wie gesagt kann ichs ja auch ausführen. nur innerhalb der anwendung versagt die anwendung an der stelle/in der funktion, wo es eine datei downloaden soll
hierfür verwende ich libcurl, was -glaub ich- mit glib zusammenhängt. und dieses wiederum bringt ja die warnings...
-
glib? Du meinst die glibc! Das ist die Standard C Library. Schau mal ob du über eine mögliche statische Version davon besitzt (also /usr/lib/libc.a oder so)
-
ja, es gibt ein ar archiv davon: /usr/lib/libc.a
habs nun auch mit gelinkt, aber das hat nichts dran geändert (die datei wird gleich groß und es kommen wieder diese warnungen):g++ -O0 -g3 -I/usr/include/glib-1.2 -I/usr/lib/glib/include -o kfz_checker kfz_checker.o -L/usr/lib -lcrypto -lc -lcurl -lidn -lssl -lcrypto -ldl -lz -lglib /test/libsmtp++-0.1.1/src/libsmtp++.a /usr/lib/libc.a /test/iniparser-2.14/libiniparser.a -static /usr/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_load': dso_dlfcn.c:(.text+0x5c): warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking /usr/lib/libcurl.a(netrc.o): In function `Curl_parsenetrc': netrc.c:(.text+0x342): warning: Using 'getpwuid' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking /usr/lib/libcurl.a(hostip6.o): In function `Curl_getaddrinfo': hostip6.c:(.text+0x152): warning: Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking /test/libsmtp++-0.1.1/src/libsmtp++.a(inetsocket.o): In function `InetSocket::connect()': inetsocket.cpp:(.text+0x30d): warning: Using 'gethostbyname' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
ne andre frage zum thema static bins:
hab neben den LDFlags auch noch einige CXXFlags: -O0 -g3 `curl-config --cflags` `pkg-config --cflags glib` `glib-config --libs`
könnte es evt. daran liegen, dass das projekt auf rechnern, wo nicht alle libs isntalliert sind scheitert, obwohl es statisch ist?libcurl lädt ja sachen für mich herunter und managt cookies etc in der anwendung. daher könnte es aber durchaus an den warnings liegen...
also bitte um hilfe...
-
btw - einige teillibs der glibc können _nicht_ statisch gelinkt werden
-
-ffrestanding:
gcc -ffreestanding booting.c -o booting.binAus der man gcc:
-ffreestanding
Assert that compilation takes place in a freestanding environment.
This implies -fno-builtin. A freestanding environment is one in
which the standard library may not exist, and program startup may
not necessarily be at "main". The most obvious example is an OS
kernel. This is equivalent to -fno-hosted.Keine Ahnung ob das euch was bringt, aber ein Verscuh ist es allemal wert.
-
gelöst...
das problem lag nicht an gcc sondern an ner datei, die libcurl benötigt, jedoch nicht selbst erstellt als -static: curl-ca-bundle.crt