【问题标题】:ld linkage problems: /usr/bin/ld: cannot find [libraryname]ld 链接问题:/usr/bin/ld: 找不到 [libraryname]
【发布时间】:2011-01-18 07:24:32
【问题描述】:

我正在使用 Qmake 在 Ubuntu 9.10 上构建共享库

此共享库 (A) 依赖于另一个共享库 (B)。

项目 B 已成功构建。

在项目 A 的 .pro 文件中,我的 LIBS 变量如下所示:

LIBS += -L../datelib/bin -llibdatelib_release.so.1.0.0

(我使用了完整的 shlib 名称,因为库版本不同。)

无论如何,当我尝试构建项目 A 时,它会在链接阶段中断,并打印错误消息:

/usr/bin/ld: cannot find -llibdatelib_release.so.1.0.0
collect2: ld returned 1 exit status
make[1]: ***[bin/libprojecta_release.so.6.0.0] Error 1
make ***[release] Error 2
Exited with code 2

从报错信息看,我以为ld是在抱怨找不到libdatelib文件,所以我手动把它复制到/usr/lib/

但是,这并没有解决问题,而且我收到了同样的错误消息。

有人知道如何解决这个问题吗?

[编辑]

我对使用 gcc 进行构建非常陌生。我知道如何创建符号链接,但我应该为 lnk 命令使用哪些路径?我要链接的文件在 /home/username/work/cppdev/datelib/bin 中。

还有我使用的构建系统(qmake),自动创建符号链接作为构建的一部分,所以我的 /home/username/work/cppdev/datelib/bin 文件夹中已经有以下文件:

  • libdatelib_release.so(符号链接)
  • libdatelib_release.so.1(符号链接)
  • libdatelib_release.so.1.0(符号链接)
  • libdatelib_release.so.1.0.0(共享库)

我可能需要问另一个问题来解释为什么有这么多符号链接(有什么意义?),以及为什么我不能直接链接到共享库,而必须通过符号链接。我已经阅读了一些在线文档,但到目前为止我所看到的似乎更像是格言/传统,而不是实际的技术原因。为什么在 Linux 上进行链接时需要这种抽象级别。

【问题讨论】:

    标签: ubuntu makefile linker qmake ld


    【解决方案1】:

    你不能那样使用 -l 。 -l 只能通过 -lFOO 查找名称为 libFOO.so 的内容。如果要在构建中这样指定,则需要一个不带版本号的符号链接。

    类似:

    ln -s /the/path/to/the/libthing.so.1.0.0 /the/path/to/the/libthing.so
    

    现在 -lthing 可以工作了。

    【讨论】:

    • 抱歉,我对在 Linux 上构建还是很陌生。我知道如何创建符号链接,但我应该为 lnk 命令使用哪些路径?我要链接的文件在 /home/username/work/cppdev/datelib/bin
    【解决方案2】:

    前缀“lib”会自动添加到库名称中 - 使用:

    LIBS += -L../datelib/bin -ldatelib_release.so.1.0.0
    

    【讨论】:

      【解决方案3】:

      您可以提供完整路径。即

      LIBS += ../datelib/bin/libdatelib_release.so.1.0.0
      

      但是我建议你按照 bmargulies 的建议去做:创建符号链接并添加 -ldatelib_release

      【讨论】:

        猜你喜欢
        • 2021-05-07
        • 1970-01-01
        • 2020-04-21
        • 2011-07-16
        • 1970-01-01
        • 2018-02-06
        • 1970-01-01
        • 2023-01-30
        • 2012-05-17
        相关资源
        最近更新 更多