2013-02-25 11 views
6

To jest trochę zawstydzające. Wiem, co się dzieje, ale nie dlaczego. Otrzymuję błąd "niezdefiniowane odniesienie do", co oznacza, że ​​linker (ld) nie umieszcza kodu z biblioteki, którą utworzyłem.Problemy z ld i biblioteką statyczną "niezdefiniowane odniesienie do"

Obecnie omawiam kurs Zed A. Shaw "Learn C the Hard Way". Próbuję ukończyć ćwiczenie 32, ale ciągle pojawia się ten sam błąd.

W książce można rozwijać plik make, który uruchamia następujące polecenie:

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

gdzie -g jest umożliwienie informacji diagnostycznych, -Wall jest umożliwienie „ALL” ostrzeżenia, -Wextra jest umożliwienie więcej warnings, -Isrc, aby dołączyć katalog src do katalogu biblioteki, -o tests/list_tests ma wytworzyć wynik o tej nazwie w tym katalogu, -DNDEBUG, aby włączyć zmienną z kodu, -O2 dla optymalizacji poziomu 2 (cokolwiek to znaczy) i kompilacji/liblcthw.a, aby dołączyć tę bibliotekę (tę, która się buduje). Reszta nie mam pojęcia, co robią.

Jeśli mam to dobrze, istnieje lista.c w katalogu src, który tworzy listę obiektów.o. Ten obiekt jest później zawarty w lib via ar i ranlib. Wywołanie nagłówka list.h powinno sprawić, że ld zajmie się kompilacją/liblcthw.a dla list.o. Chodzi o to, że ld nie czyta build/liblcthw.a z jakiegoś powodu. Dostaję to niezdefiniowane odniesienie do błędu.

Próbowałem skontaktować się z Zedem, ale najwyraźniej jest zapracowanym człowiekiem. Mam nadzieję, że otrzymam pomoc. Powiedz, czy muszę dodać więcej informacji o problemie. Here's do tej pory link do całej biblioteki.

Mam nadzieję, że ktoś może mi pomóc.

+7

Zamówienie spraw. Biblioteki statyczne przechodzą * po * plikach źródłowych/obiektowych w linii poleceń. –

+0

Nie otrzymałem Twojej rekomendacji –

+3

Zmienianie kolejności argumentów wiersza polecenia. Plik .c musi iść pierwszy, a plik .a musi iść po tym. –

Odpowiedz

6

Czy następują następujące czynności?

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

Co to robi to za pomocą opcji -l połączyć przeciwko biblioteki, a opcja -L aby określić dodatkowy katalog, w którym łącznik powinien szukać bibliotek. Przedrostek lib i przyrostek .a nie może być określony w argumencie -l.

Należy pamiętać, że jeśli masz również bibliotekę współużytkowaną (* .so) w katalogu "kompilacja", rzeczy się komplikują. Aby zachować prostotę, usuń plik "liblcthw.so" i zachowaj tylko "liblcthw.a" lub spróbuj połączyć bibliotekę statyczną, wymieniając ją jako dane wejściowe, tak jak pierwotnie, ale określając ją po Twój plik źródłowy:

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

Że _ pomoc mi. Program skompilowany, ale teraz podczas uruchamiania tego błędu pojawia się "./tests/list_tests: błąd podczas ładowania bibliotek współdzielonych: liblcthw.so: nie można otworzyć pliku obiektu współdzielonego: Brak takiego pliku lub katalogu" Czy szuka liblcthw.so w katalogu biblioteki ? Jeśli tak, to jak tego uniknąć? –

+0

@LucianoRobino * Czy * istnieje plik "liblcthw.so" w katalogu "kompilacja"? Ponieważ jeśli nie było, polecenie kompilacji nie powiodło się. –

+0

To nie będzie korzystać z biblioteki statycznej. –

Powiązane problemy