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ć?
+1 Och, dziękuję! Wiem, że kolejność linkowania ma sens, ale naprawdę pomaga przypomnieć sobie te fakty! – scraimer
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 :) –
Dziękuję, to było WIELKIE przypomnienie! –