Hallo, ich hab mal eine Verständnisfrage: Um z.B. printf benutzen zu können, wird stdio.h eingebunden: #include <stdio.h> Wenn dann beim Raspberry Pi die Funktionen aus wiringPi benutzt werden sollen, wird auch hier der entprechende Header eingebunden mit #include <wiringPi.h> Zusätzlich muss dem Linker aber folgendes mitgegeben werden: -l wiringPi Warum wird das im ersten Fall nicht benötigt, dagegen aber im zweiten? Besten Dank. Sören
Weil die Funktionen aus dem C-Standard zwar seitens des Compilers auf verschiedene Dateien verteilt sind, für den Linker aber üblicherweise in einer Lib zusammengefasst werden. Ausnahme ist auf manchen Systemen alles, was mit Gleitkommazahlen und math.h zu tun hat - das ist gelegentlich in einer eigenen libm.so bzw. libm.a enthalten, dafür muß man dann -lm beim Linken angegeben.
Sören schrieb: > Warum wird das im ersten Fall nicht benötigt, dagegen aber im zweiten? weil printf in einer lib ist die Eigenständig von Linker mit eingebunden wird.
Sören schrieb: > Wo kann ich sehen, welche Libraries der Linker von sich aus einbindet? The -v option to gcc will cause it to dump information about the default options it will use including the library paths and default libraries and object files that will be linked in.
Und falls du wissen willst, welche Symbole von einer Lib aufgelöst werden können (also von ihr exportiert werden), hilft so etwas wie nm:
1 | nm --defined-only /usr/lib/x86_64-linux-gnu/libc.a |
Evtl. hilft auch das beiliegende Skript weiter, falls man nach Symbolen sucht:
1 | klwa4731@1188 ~ $ lsexposym pthread_create |
2 | Suche nach Symbol pthread_create |
3 | |
4 | pthread_create gefunden in /usr/lib/x86_64-linux-gnu/libpthread.a: |
5 | Textsegment (Code): __pthread_create_2_1 |
6 | Weak Symbol: pthread_create |
7 | |
8 | |
9 | pthread_create gefunden in /usr/lib/gcc/x86_64-linux-gnu/4.6/32/libgcc.a: |
10 | Textsegment (Code): __wrap_pthread_create |
11 | |
12 | |
13 | pthread_create gefunden in /usr/lib/gcc/x86_64-linux-gnu/4.6/libgcc.a: |
14 | Textsegment (Code): __wrap_pthread_create |
15 | |
16 | |
17 | pthread_create gefunden in /lib/x86_64-linux-gnu/libpthread-2.15.so: |
18 | Textsegment (Code): pthread_create@@GLIBC_2.2.5 |
19 | |
20 | |
21 | pthread_create gefunden in /lib/x86_64-linux-gnu/libpthread.so.0: |
22 | Textsegment (Code): pthread_create@@GLIBC_2.2.5 |
23 | |
24 | |
25 | pthread_create gefunden in /lib/i386-linux-gnu/libpthread-2.15.so: |
26 | Textsegment (Code): pthread_create@@GLIBC_2.1 |
27 | Textsegment (Code): pthread_create@GLIBC_2.0 |
28 | |
29 | |
30 | pthread_create gefunden in /lib/i386-linux-gnu/libpthread.so.0: |
31 | Textsegment (Code): pthread_create@@GLIBC_2.1 |
32 | Textsegment (Code): pthread_create@GLIBC_2.0 |
33 | |
34 | klwa4731@1188 ~ $ lsexposym snprintf |
35 | Suche nach Symbol snprintf |
36 | |
37 | snprintf gefunden in /usr/lib/x86_64-linux-gnu/libc.a: |
38 | Textsegment (Code): __snprintf |
39 | Weak Symbol: snprintf |
40 | Textsegment (Code): _IO_vsnprintf |
41 | Weak Symbol: __vsnprintf |
42 | Weak Symbol: vsnprintf |
43 | Textsegment (Code): ___snprintf_chk |
44 | Textsegment (Code): __snprintf_chk |
45 | Textsegment (Code): ___vsnprintf_chk |
46 | Textsegment (Code): __vsnprintf_chk |
47 | |
48 | |
49 | snprintf gefunden in /usr/lib/vmware-ovftool/libcurl.so.4: |
50 | Textsegment (Code): curl_msnprintf |
51 | Textsegment (Code): curl_mvsnprintf |
52 | |
53 | |
54 | snprintf gefunden in /usr/lib/vmware-ovftool/libcrypto.so.1.0.0: |
55 | Textsegment (Code): BIO_snprintf |
56 | Textsegment (Code): BIO_vsnprintf |
57 | |
58 | |
59 | snprintf gefunden in /usr/lib/jvm/java-6-openjdk-amd64/jre/lib/amd64/jamvm/libjvm.so: |
60 | Textsegment (Code): jio_snprintf |
61 | Textsegment (Code): jio_vsnprintf |
62 | ... |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.