2013-02-25 8 views
6

Dieser ist ein wenig peinlich. Ich weiß, was los ist, aber nicht warum. Ich bekomme einen "undefinierten Verweis auf" -Fehler, was bedeutet, dass der Linker (ld) den Code nicht aus der Bibliothek, die ich erstellt habe, setzt.Probleme mit ld und statische Bibliothek "undefinierter Verweis auf"

Ich mache derzeit mit Zed A. Shaw "Learn C the Hard Way" natürlich herumalbern. Ich versuche Übung 32 zu beenden, aber ich bekomme immer den gleichen Fehler.

Im Buch, das Sie eine Make-Datei zu entwickeln, die den folgenden Befehl ausführt:

cc -g -O2 -Wall -Wextra -Isrc -rdynamic -DNDEBUG build/liblcthw.a \ 
    tests/list_tests.c -o tests/list_tests 

wo -g ist Debug-Informationen zu ermöglichen, -Wall ist „alle“ Warnungen zu ermöglichen, ist -Wextra mehr zu ermöglichen, Warnungen, -Isrc, um das src-Verzeichnis in das Bibliotheksverzeichnis aufzunehmen, -o tests/list_tests erzeugt eine Ausgabe mit diesem Namen in diesem Verzeichnis, -DNDEBUG, um eine Variable aus dem Code zu aktivieren, -O2 für die Optimierung der Ebene 2 (was auch immer das bedeutet)) und build/liblcthw.a, um diese Bibliothek (diejenige, die gerade gebaut wird) aufzunehmen. Den Rest habe ich keine Ahnung was sie machen.

Wenn ich es richtig verstanden habe, gibt es eine list.c im Verzeichnis src, die eine Objektliste erstellt. Dieses Objekt wird später in die lib via ar und ralib eingebunden. Also sollte der Aufruf des Headers list.h ld veranlassen, in build/liblcthw.a nach list.o zu suchen. Die Sache ist, ld liest Build/liblcthw.a aus irgendeinem Grund nicht. Also bekomme ich diesen undefinierten Verweis auf Fehler.

Ich habe versucht, Zed zu kontaktieren, aber er ist anscheinend ein beschäftigter Mann. Also hoffe ich hier Hilfe zu bekommen. Sagen Sie mir, ob ich weitere Informationen zu dem Problem hinzufügen muss. Here's ein Link zu der ganzen Bibliothek bisher.

Ich hoffe, dass mir jemand helfen kann.

+7

Bestellung Angelegenheiten. Statische Bibliotheken gehen * nach * Quell-/Objektdateien in der Befehlszeile. –

+0

Ich habe Ihre Empfehlung nicht erhalten –

+3

Ändern Sie die Reihenfolge der Befehlszeilenargumente. Die .c-Datei muss zuerst gehen und die .a-Datei muss danach gehen. –

Antwort

6

Funktioniert Folgendes?

 
cc -g -O2 -Wall -Wextra -Isrc -rdynamic -DNDEBUG tests/list_tests.c \ 
    -o tests/list_tests -Lbuild -llcthw 

Was das bedeutet wird, um die -l Option gegen die Bibliothek zu verknüpfen und die -L Option ein zusätzliches Verzeichnis angeben, in dem der Linker für Bibliotheken aussehen sollte. Das lib Präfix und das .a Suffix dürfen nicht im Argument -l angegeben werden.

Beachten Sie, dass, wenn Sie auch eine gemeinsame Bibliothek (* .so) im Verzeichnis "Build" haben, die Dinge kompliziert werden. Um die Dinge einfach zu halten, sollten Sie entweder die Datei "liblcthw.so" löschen und nur "liblcthw.a" beibehalten oder versuchen, die statische Bibliothek einzubinden, indem Sie sie wie eine Eingabe auflisten, wie Sie es ursprünglich getan haben, aber angeben nach Ihre Quelldatei:

 
cc -g -O2 -Wall -Wextra -Isrc -rdynamic -DNDEBUG tests/list_tests.c \ 
    -o tests/list_tests build/liblcthw.a 
+0

Das _kinda_ helfen. Das Programm kompiliert, aber jetzt während der Ausführung dieses Fehlers erscheint "./tests/list_tests: Fehler beim Laden freigegebener Bibliotheken: liblcthw.so: kann keine gemeinsame Objektdatei öffnen: Keine solche Datei oder Verzeichnis" Sucht es liblcthw.so im Bibliotheksverzeichnis ? Wenn ja, wie vermeide ich das? –

+0

@LucianoRobino * Ist * eine Datei "liblcthw.so" im Verzeichnis "build"? Wenn nicht, wäre der Kompilierbefehl fehlgeschlagen. –

+0

Dies wird nicht die statische Bibliothek verwenden. –

Verwandte Themen