46

Próbuję użyć biblioteki libtommath. Używam IDE NetBeans dla mojego projektu na Linuksie Ubuntu. Pobrałem i zbudowałem bibliotekę, zrobiłem "make install", aby umieścić powstały plik .a w/usr/lib/i pliki .h do/usr/includePróba włączenia biblioteki, ale wciąż pojawia się "niezdefiniowane odniesienie do" wiadomości

Wygląda na to, że znajduję pliki odpowiednio (ponieważ nie mam już tych błędów, które zrobiłem przed instalacją w katalogach/usr).

Jednak gdy tworzę prosty główny wykonanie połączenia do mp_init (co jest w bibliotece), pojawia się następujący komunikat o błędzie podczas próby, aby mój projekt:

mkdir -p build/Debug/GNU-Linux-x86 
rm -f build/Debug/GNU-Linux-x86/main.o.d 
gcc -c -g -MMD -MP -MF build/Debug/GNU-Linux-x86/main.o.d -o build/Debug/GNU-Linux-x86/main.o main.c 
mkdir -p dist/Debug/GNU-Linux-x86 
gcc -o dist/Debug/GNU-Linux-x86/cproj1 build/Debug/GNU-Linux-x86/main.o 
build/Debug/GNU-Linux-x86/main.o: In function 'main': 
/home/[[myusername]]/NetBeansProjects/CProj1/main.c:18: undefined reference to `mp_init' 
collect2: ld returned 1 exit status 
make[2]: *** [dist/Debug/GNU-Linux-x86/cproj1] Error 1 

Tak, to wygląda linker nie może znaleźć funkcji w bibliotece, jednak jest tam, więc po prostu nie wiem, co może być przyczyną tego.

Otrzymuję ten sam błąd, jeśli bezpośrednio wpisuję polecenie gcc i pomijam plik makefile, upewniłem się również, że biblioteka statyczna została skompilowana również z gcc.

Edytowane do dodania:

uzyskać te same błędy, jeśli robię kompilacji bezpośrednio i dodać bibliotekę z -l lub -L:

$ gcc -l /usr/lib/libtommath.a main.c 
/usr/bin/ld: cannot find -l/usr/lib/libtommath.a 
collect2: ld returned 1 exit status 

$ gcc -llibtommath.a main.c 
/usr/bin/ld: cannot find -llibtommath.a 
collect2: ld returned 1 exit status 

$ gcc -Llibtommath.a main.c 
/tmp/ccOxzclw.o: In function `main': 
main.c:(.text+0x18): undefined reference to `mp_init' 
collect2: ld returned 1 exit status 

$ gcc -Llibtommath.a main.c 
/tmp/ccOxzclw.o: In function `main': 
main.c:(.text+0x18): undefined reference to `mp_init' 
collect2: ld returned 1 exit status 

Jestem bardzo zardzewiały na tych rzeczy, więc Nie jestem pewien, czy używam odpowiedniego polecenia tutaj, w przykładach -L znajdują się biblioteki? Jeśli biblioteka nie zostanie znaleziona, jak do cholery, mogę ją znaleźć, aby znaleźć bibliotekę? Jest w/usr/lib, próbowałem go z plikiem .a w bieżącym katalogu, itp. Czy istnieje zmienna środowiskowa, którą muszę ustawić? Jeśli tak, to jak, itp.

Próbowałem już zupełnie innej biblioteki (GMP) i miałem dokładnie ten sam problem. To musi być jakiś problem środowiskowy Ubuntu? Ktoś ma jakiś pomysł, jak to naprawić?

Odpowiedz

113

Sztuką jest tutaj umieszczenie biblioteki PO TYM module, który kompilujesz. Problem jest rzeczą odniesienia. Łącznik rozstrzyga odnośniki w kolejności, więc gdy biblioteka jest PRZED komponowaniem modułu, linker jest zdezorientowany i nie uważa, że ​​którakolwiek z funkcji w bibliotece jest potrzebna. Umieszczając bibliotekę PO module, odniesienia do biblioteki w module są rozwiązywane przez linker.

+7

+1 Och, dziękuję! Wiem, że kolejność linkowania ma sens, ale naprawdę pomaga przypomnieć sobie te fakty! – scraimer

+1

To zadziałało dla mnie. Mój bardzo stary plik Makefile działał, ale teraz wygląda na to, że kompilator staje się zbyt mądry dla własnego dobra :) –

+2

Dziękuję, to było WIELKIE przypomnienie! –

35

Tak, wymagane jest dodanie bibliotek po źródłowych plikach/obiektach. Komenda ta rozwiązuje problem:

gcc -static -L/usr/lib -I/usr/lib main.c -ltommath 
+1

+1 za pisanie poprawnego sposobu połączenia z 'libtommath.a' – scraimer

+0

Wow, to jest dość trudne. Dziękuję za wskazanie tego. – lolski

4

przypadku plików źródłowych .c przelicza cpp (na przykład jak w parsec), wówczas zewnętrzny należy następnie „C”, jak w

extern "C" void foo(); 
Powiązane problemy