0

我有一个共享对象(abc.so),它是在将它链接到一堆库(.a 和 .so)文件后构建的。现在这个 abc.so 只公开了 3 个函数。

现在我正在 Linux 上编写一个控制台应用程序,它使用这个 abc.so 来调用这些函数。当我尝试构建该应用程序时,

我得到一堆 - “未定义的对'xxxxxxx'的引用”错误。现在这些引用指向 abc.so 依赖于 abd 的 so ,甚至更深入地了解这些 so 中的引用。

我不确定为什么会这样。它不应该在运行时加载那些吗?至少这就是我的想法(来自 Windows/MSVC 背景)。

请帮我解决这个问题。

4

2 回答 2

2

您必须将您的应用程序与对您的应用程序所依赖的所有共享对象 (.so) 的引用链接起来。您无需重新链接静态包含的档案 (.a)

如果 abc.so 是用 a.so、b.so 和 ca 构建的,那么您必须将应用程序与 abc.so、a.so 和 b.so 链接起来。

当您的应用程序正确链接时,您还必须确保它可以找到共享对象。您可以使用“ldd myapp”列出共享对象依赖项。

my2c

于 2010-06-24T14:26:16.770 回答
1

您仍然需要链接库文件,但您告诉链接器应该在运行时通过与 .so 文件链接来从共享库加载符号。你的链接器命令行是什么样的?

还要检查您的 LD_LIBRARY_PATH。如果您的共享库不在标准位置之一,例如/usr/lib,那么您需要执行以下操作:

export LD_LIBRARY_PATH=pathToDirWithYourSharedLibrary:$LD_LIBRARY_PATH

如果你不这样做,你会得到运行时错误。

于 2010-06-24T14:19:34.793 回答