5

我使用 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 上链接时需要这种抽象级别。

4

3 回答 3

9

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

就像是:

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

现在 -lthing 将起作用。

于 2010-02-18T12:30:37.400 回答
3

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

LIBS += -L../datelib/bin -ldatelib_release.so.1.0.0
于 2010-02-18T12:31:27.613 回答
0

您可以提供完整路径。IE

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

但是,我建议您按照 bmargulies 的建议进行操作:创建符号链接并添加 -ldatelib_release

于 2010-02-18T12:34:52.710 回答