Warum muss ich die lib explizit dem Linker bekannt machen?

D

DickUndDa

Hi miteinand,

ich beschäftige mich derzeit mit der libetpan. Eine c lib für IMAP/POP3/SMTP. Und ich habe ewig gebraucht um herauszufinden warum ich immmer folgenden Fehler bekam wen ich das beispielprogramm kompilieren wollte:
/usr/bin/ld: Undefined symbols:
_clist_insert_after
_mailimf_address_list_add_parse
_mailimf_address_list_free
_mailimf_address_list_new_empty
_mailimf_fields_free
_mailimf_fields_new_with_data
_mailimf_mailbox_list_add_parse
_mailimf_mailbox_list_free
_mailimf_mailbox_list_new_empty
_mailmime_content_free
_mailmime_content_new_with_str
_mailmime_fields_free
_mailmime_fields_new_encoding
_mailmime_fields_new_filename
_mailmime_free
_mailmime_new_empty
_mailmime_new_message_data
_mailmime_param_new_with_data
_mailmime_parameter_free
_mailmime_set_body_file
_mailmime_set_body_text
_mailmime_set_imf_fields
_mailmime_smart_add_part
_mailmime_write

Es hat einfach daran gelegen dass der Linker die binary-lib nicht gefunden hat.

Nun meine Frage: Wieso hat er sie nicht gefunden?
Mit "gcc -letpan -o test compose-msg.c" läuft das kompilieren ohne Probleme durch. Lasse ich "-letpan" weg bekomme ich wieder obige Fehler. Ich meine wenn ich "-l" benutze dann heißt das doch dass die lib schon im Suchpfad des linkers ist, wieso findet er die lib dann nicht automatisch?

Viel Text^^ Wenn ihr mehr angaben braucht lasst es mich wissen ;)
 

?=?

Mitglied
Mitglied seit
09.02.2004
Beiträge
952
Woher soll der Linker wissen, dass er sich bei den vermissten Symbol in der besagten Lib bedienen soll?
Alle Libs scannen? Wie soll der Linker sich entscheiden, welche Lib die richtige ist, wenn ein Symbol in mehreren enthalten ist?


?=?
 
Zuletzt bearbeitet:
D

DickUndDa

Woher soll der Linker wissen, dass er sich bei den vermissten Symbol in der besagten Lib bedienen soll?
Alle Libs scannen? Wie soll der Linker sich entscheiden, welche Lib die richtige ist, wenn ein Symbol in mehreren iniert ist?


?=?
hm stimmt. Das heißt, das er nur die gnu-Stdlibs (bzw. was der compilerbauer halt so mitliefert) automatisch einbindet - bei zusätzlichen libs muss man das händisch machen. So richtig?

EDIT: Bzw. binde ich doch per #include die header-datei ein, aber der gleiche name reicht dann nicht aus um die binär lib zu finden?

Sorry, falls die Frage etwas dumm ist - aber bisher habe ich nur mit meinen eigenen libs gearbeitet - die ich immer gleich mitübersetzt hat - binär-libs sind ein neues gebiet für mich.

EDIT2: Danke natürlich ;)
 

anegmawad

Mitglied
Mitglied seit
12.04.2007
Beiträge
583
Nein, der Header reicht nicht aus.

a) Der Linker weiß nichts davon, nur der Compiler.

b) Einen Header kann es mehrfach geben. Er muss nicht im gleichen Verzeichnis liegen.

c) Eine Library kann mehrere Header haben.
 

?=?

Mitglied
Mitglied seit
09.02.2004
Beiträge
952
Sorry, falls die Frage etwas dumm ist - aber bisher habe ich nur mit meinen eigenen libs gearbeitet - die ich immer gleich mitübersetzt hat - binär-libs sind ein neues gebiet für mich.
Das sind keine dummen Fragen. Es ist ein komplexes Thema :)

EDIT2: Danke natürlich ;)
Dann benutz' doch den "Danke"-Button rechts ;)

. . . Deine weiteren Fragen wurden ja schon durch anegmawad beantwortet.


?=?
 
Oben