为什么GNU链接器找不到带-l <library>?</library>的共享对象

时间:2011-03-09 08:49:21

标签: linux gcc linker ld

尝试链接目标文件时出错:

$ g++ -o intro intro.o -L -Wl,-rpath-link  -lnotes -lm -lnsl -lpthread -lc -lresolv -ldl
/usr/bin/ld: cannot find -lnotes
collect2: ld returned 1 exit status

然而,图书馆似乎就在那里(事实上,我把/opt/ibm/lotus/notes包含在/etc/ld.so.conf.d/中并运行ldconfig)中将其放在那里:

$ ldconfig --print-cache | grep libnotes                                                      
361:    libnoteswc.so (libc6) => /opt/ibm/lotus/notes/libnoteswc.so
362:    libnotes.so (libc6) => /opt/ibm/lotus/notes/libnotes.so

为什么链接失败以及如何使链接器使用这些共享对象?

2 个答案:

答案 0 :(得分:1)

  

GCC没有指定运行路径,因此动态链接器可以在运行时找到动态库...另一个适用于几个平台的选项是将库的完整路径名硬编码到其soname中。这只能通过在libstdc ++ / config(以及libg ++ / config,如果你正在构建libg ++)中修改相应的.ml文件来实现,这样$(libdir)/出现在-soname或-h选项中的库名之前

http://gcc.gnu.org/faq.html#rpath

答案 1 :(得分:1)

尝试使用ld的-L标志。我的Makefile之一的一个例子:

CFLAGS=-c -Wall -O2 \
       -I../libs/libs-x86/include
LDFLAGS=-lupnp \
        -L ../libs/libs-x86/lib

我认为“/etc/ld.so.conf.d/”中描述的库仅用于运行时...希望这有帮助!