为什么 GNU 链接器找不到带有 -l的共享对象?

发布于 2024-10-20 18:11:13 字数 635 浏览 2 评论 0原文

我在尝试链接目标文件时遇到错误:

$ 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

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

I'm getting an error when trying to link an object file:

$ 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

However, the library seems to be there (in fact, I put it there by including /opt/ibm/lotus/notes in a file in /etc/ld.so.conf.d/ and running 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

Why does the linking fail and how can I bring the linker to use these shared objects?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

脱离于你 2024-10-27 18:11:13

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

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

GCC does not specify a runpath so that the dynamic linker can find dynamic libraries at runtime...Yet another option, that works on a few platforms, is to hard-code the full pathname of the library into its soname. This can only be accomplished by modifying the appropriate .ml file within libstdc++/config (and also libg++/config, if you are building libg++), so that $(libdir)/ appears just before the library name in -soname or -h options.

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

爱已欠费 2024-10-27 18:11:13

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

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

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

Try with the -L flag for ld. An example of one of my Makefile :

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

I think libraries described in "/etc/ld.so.conf.d/" are for runtime only ... Hope this helps !

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文