问题 “/ usr / bin / ld:找不到库”


这是我第一次尝试使用makefile编译FORTRAN代码。操作系统是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

我有什么办法可以解决这个错误吗?我应该尝试其他编译器吗?


9968
2018-05-08 16:28


起源

我要检查的第一件事是你真的有 libwdm.so 和 libadwdm.so。我认为他们应该参与其中 libanne4.0/lib 目录。 - wkl
是, libwdm.a     和 libadwdm.a 在那儿。 - TH339
哦,静态库。你可以在makefile中试试这个吗? przm2_LIBS = -L../libanne4.0/lib -Wl,-Bdynamic -lutil -Wl,-Bstatic -lwdm -ladwdm - 我假设 util 是 libutil.so (共享图书馆),因为它没有抱怨。 - wkl
谢谢你的建议。试过你的建议。以下是新产出: /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 - TH339
我认为alk可能是某种东西(可能是路径问题)。你能在中显示库的目录列表吗? libanne4.0/lib?另外,将行更改为 przm2_LIBS = -L(path/to/libanne4.0/lib) -Wl,-Bstatic -lwdm -ladwdm -Wl,-Bdynamic -lutil  - lgcc_s 东西是因为我设置链接器使用静态链接作为最后一件事,所以这改变它使用动态链接。 - wkl


答案:


../libanne4.0/lib 是一个相对路径,您可以尝试将其更改为绝对路径。

您还可以检查链接器进程是否有权访问和读取库。


更新:让链接器找到使用该选项指定的库 -l<name> libray的名称应为 lib<name>.[a|so] 和参数 -L 应该指出图书馆所在的路径。

-L 需要先于它 -l 选项(S)。

人们可以指明 -l 和/或 -L 多次。


10
2018-05-08 16:45



提供绝对路径,但同样的错误。我试过了 ld adwdmlib.a 并得到以下错误: ld: warning: cannot find entry symbol _start; not setting start address 谢谢 - TH339
什么是 adwdmlib.a? - alk
adwdmlib.a是我需要包含的库。基于L和l规则,你提出了修正。这是不是意味着 przm2_LIBS = -L ../libanne4.0/lib -lwdm -ladwdm -lutil 不起作用,因为这些库的名称不正确? - TH339
是的,我会这么说。 @ tao.hong - alk
这是一个很好的信息页面 - HMS


名称“adwdmlib.a”有问题。链接标志“-l adwdm”将告诉编译器期望一个名为“libadwdm.a”的lib文件,而不是“adwdmlib.a”。这有用还是相关?如果您的库名是“adwdmlib.a”,那么这可能是您的链接器无法找到它的原因。


1
2018-05-08 21:42



感谢您的评论。我试图重命名这些库,但链接器仍然找不到它们。 - TH339