/usr/bin/ld: не удается найти библиотеку

Я впервые пытаюсь скомпилировать код FORTRAN с помощью make-файла. ОС — Ubuntu 12.04 LTS 64 бит. Я столкнулся со следующими ошибками:

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

Ключевым элементом makefile является:

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

Могу ли я что-нибудь сделать, чтобы исправить эту ошибку? Должен ли я попробовать другие компиляторы?


person TTT    schedule 08.05.2012    source источник
comment
Первое, что я бы проверил, это действительно ли у вас есть libwdm.so и libadwdm.so. Я бы предположил, что они должны быть в этом каталоге libanne4.0/lib.   -  person wkl    schedule 08.05.2012
comment
Да, libwdm.a и libadwdm.a есть.   -  person TTT    schedule 08.05.2012
comment
О, статические библиотеки. Можете ли вы попробовать это в вашем make-файле? przm2_LIBS = -L../libanne4.0/lib -Wl,-Bdynamic -lutil -Wl,-Bstatic -lwdm -ladwdm — я предполагаю, что util — это libutil.so (разделяемая библиотека), так как он не жаловался на это.   -  person wkl    schedule 08.05.2012
comment
Спасибо за предложение. Попробовал ваше предложение. Вот новые результаты: /usr/bin/ld: cannot find -lwdm /usr/bin/ld: cannot find -ladwdm /usr/bin/ld: cannot find -lgcc_s /usr/bin/ld: cannot find -lgcc_s /usr/bin/ld: cannot find -lgcc_s   -  person TTT    schedule 08.05.2012
comment
Я думаю, что alk может быть на что-то (может быть, проблема с путем). Можете ли вы показать список каталогов библиотек в libanne4.0/lib? Кроме того, измените строку на przm2_LIBS = -L(path/to/libanne4.0/lib) -Wl,-Bstatic -lwdm -ladwdm -Wl,-Bdynamic -lutil - материал lgcc_s был потому, что я установил компоновщик на использование статической компоновки в последнюю очередь, поэтому это меняет его на использование динамической компоновки.   -  person wkl    schedule 08.05.2012
comment
@birryree: попытался предложить абсолютный путь и использовать новые аргументы. Он жаловался на что-то другое: gfortran: error: unrecognized option ‘-wdm’. Затем я удалил опцию -wdm. Аналогичная ошибка msg '/usr/bin/ld: не удается найти -ladwdm'   -  person TTT    schedule 08.05.2012
comment
Извините, вы, должно быть, использовали мой комментарий до того, как я его отредактировал, он должен был быть -lwdm. Очень, очень хитрый метод — использовать полные пути для ссылки, например: gfortran (the regular stuff) /path/to/libwdm.a /path/to/libadwdm.a -L../libanne4.0/lib -util.   -  person wkl    schedule 08.05.2012
comment
Спасибо за ваше предложение. Я попробовал /home/th/Desktop/przm_ed/libanne4.0/lib/wdmlib.a /home/th/Desktop/przm_ed/libanne4.0/lib/adwdmlib.a /home/th/Desktop/przm_ed/libanne4.0/lib/utillib.a и получил ответы /home/th/Desktop/przm_ed/libanne4.0/lib/utillib.a(dttmsn.o): In function sydate_': dttmsn.f:(.text+0x2c5): неопределенная ссылка на idate_' /home/th/Desktop/przm_ed/libanne4.0/lib/utillib.a(dttmsn.o): In function sytime_': dttmsn.f:(.text+0x32c): неопределенная ссылка на itime_' collect2: ld returned 1 exit status Означает ли это, что эти пути принимаются?   -  person TTT    schedule 08.05.2012
comment
Казалось бы, да, но теперь у вас возникают проблемы с отсутствующим определением, так как idate_ и itime_ не найдены. Я не знаю, откуда они, может быть, это специфично для gfortran.   -  person wkl    schedule 08.05.2012
comment
@birryree Большое спасибо за вашу помощь!   -  person TTT    schedule 08.05.2012


Ответы (2)


Поскольку ../libanne4.0/lib — это относительный путь, вы можете попробовать изменить его на абсолютный.

Также вы можете проверить, имеет ли процесс компоновщика права доступа и чтения библиотек.


Обновление: чтобы компоновщик нашел библиотеку, указанную с помощью параметра -l<name>, имя библиотеки должно быть lib<name>.[a|so], а параметр -L должен указывать путь, по которому находится библиотека.

-L должно предшествовать -l параметрам.

Можно указать -l и/или -L несколько раз.

person alk    schedule 08.05.2012
comment
Указан абсолютный путь, но та же ошибка. Я попробовал ld adwdmlib.a и получил следующие ошибки: ld: warning: cannot find entry symbol _start; not setting start address спасибо - person TTT; 08.05.2012
comment
adwdmlib.a — это библиотека, которую мне нужно включить. На основании правила L и l, которое вы упомянули. Означает ли это, что przm2_LIBS = -L ../libanne4.0/lib -lwdm -ladwdm -lutil не работает, потому что имена этих библиотек неверны? - person TTT; 08.05.2012

Что-то не так с именем "adwdmlib.a". Флаг связывания "-l adwdm" сообщает компилятору, что следует ожидать файл lib с именем "libadwdm.a", а не "adwdmlib.a". Это полезно или актуально? Если имя вашей библиотеки "adwdmlib.a", вероятно, поэтому ваш компоновщик не может ее найти.

person bob.sacamento    schedule 08.05.2012
comment
Спасибо за комментарий. Я пытался переименовать эти библиотеки, но компоновщик так и не смог их найти. - person TTT; 09.05.2012