2012-05-08 27 views
11

To jest moja pierwsza próba skompilowania kodu FORTRAN za pomocą pliku makefile. System operacyjny to Ubuntu 12.04 LTS 64 bit. Natknąłem się następujące błędy:"/ usr/bin/ld: nie można znaleźć biblioteki"

gfortran -o przm3123.exe canopy.o chem.o cnfuns.o cropdate.o datemod.o debug.o debug_cn.o f2kcli.o floatcmp.o furrow.o general.o i_errchk.o infnan.o inivar.o ioluns.o iosubs.o lambertw.o m_readvars.o utils.o wind.o fcscnc.o przm3.o rsexec.o rsinp1.o rsinp2.o rsinp3.o rsmcar.o rsmisc.o rsprz1.o rsprz2.o rsprz3.o rsprzn.o rsutil.o rsvado.o -L ../libanne4.0/lib -lwdm -ladwdm -lutil 
/usr/bin/ld: cannot find -lwdm 
/usr/bin/ld: cannot find -ladwdm 
collect2: ld returned 1 exit status 
make: *** [przm3123.exe] Error 1 

Kluczowym elementem w makefile brzmi:

przm2_LIBS = -L ../libanne4.0/lib -lwdm -ladwdm -lutil 

Czy mogę coś zrobić, aby naprawić ten błąd? Czy powinienem spróbować innych kompilatorów?

+3

Pierwszą rzeczą, którą chciałbym sprawdzić jest to, czy faktycznie masz 'libwdm.so' i' libadwdm.so'. Zakładam, że powinny znajdować się w tym katalogu 'libanne4.0/lib'. – birryree

+0

Tak, są tam 'libwdm.a' i' libadwdm.a'. –

+0

Och, biblioteki statyczne. Czy możesz spróbować tego w swojej makefile? 'przm2_LIBS = -L ../ libanne4.0/lib -Wl, -Bdynamic -lutil -Wl, -Bstatic -lwdm -ladwdm' - Zakładam, że' util' to 'libutil.so' (biblioteka współdzielona), ponieważ nie narzekać na to. – birryree

Odpowiedz

10

Jako, że ../libanne4.0/lib jest ścieżką względną, możesz spróbować zmienić ją na bezwzględną.

Można również sprawdzić, czy proces łączenia ma prawa dostępu do bibliotek i ich odczytu.


Aktualizacja: Aby mieć łącznik znaleźć bibliotekę określony za pomocą opcji -l<name> nazwa libray będzie lib<name>.[a|so] a parametr do -L powinien wskazywać drogę były biblioteki znajduje.

-L musi poprzedzić opcję -l.

Można podać wiele razy -l i/lub -L.

+1

Podana ścieżka bezwzględna, ale ten sam błąd. Próbowałem 'ld adwdmlib.a' i otrzymałem następujące błędy:' ld: warning: nie można znaleźć symbolu wejścia _start; nie ustawia adresu początkowego "dzięki –

+1

Co to jest" adwdmlib.a "? – alk

+1

adwdmlib.a to biblioteka, którą muszę uwzględnić. W oparciu o zasady L i L, które wymieniłeś. Czy to oznacza, że ​​'przm2_LIBS = -L ../libanne4.0/lib -lwdm -ladwdm -lutil' nie działa, ponieważ nazwa tych bibliotek nie jest poprawna? –

1

Coś jest nie tak z nazwą "adwdmlib.a". Flaga łącząca "-l adwdm" powie kompilatorowi, że oczekuje pliku lib o nazwie "libadwdm.a", a nie "adwdmlib.a". Czy to pomocne lub istotne? Jeśli nazwa twojej biblioteki brzmi "adwdmlib.a", prawdopodobnie Twój linker nie może jej znaleźć.

+0

Dzięki za komentarz. Próbowałem zmienić nazwy tych bibliotek, ale linker nadal nie mógł ich znaleźć. –

Powiązane problemy