Forum: Mikrocontroller und Digitale Elektronik include und linker


von Sören (Gast)


Lesenswert?

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

von Klaus W. (mfgkw)


Lesenswert?

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.

von Peter II (Gast)


Lesenswert?

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.

von Sören (Gast)


Lesenswert?

Wo kann ich sehen, welche Libraries der Linker von sich aus einbindet?

von Peter II (Gast)


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

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

von Klaus W. (mfgkw)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.