【问题标题】:Multiple definition of a symbol while building a shared library with static libraries使用静态库构建共享库时对符号进行多重定义
【发布时间】:2014-12-07 07:21:21
【问题描述】:

我必须从多个目标文件构建一个共享库。假设对象文件 Obj1.oObj2.o 保存在 obj_folder 下,并且都使用公共函数 foo()。函数foo() 在另一个cpp 文件中定义,我们称之为foo.cpp。 foo.cpp 的 ibject 也存在于 obj_folder 下。

场景如下:

In obj1.cpp
void func1()
{
int timestamp =foo();
}

in obj2.cpp
void func2()
{
int timestamp = foo();
}

这两个文件的 obj1.o 和 obj2.o 分别构建。我在这里的想法是 obj1.o 和 obj2.o 都为 foo() 静态构建代码,而在构建链接器时,只是找不到它应该从哪个对象中选择 foo() 位置。

构建共享对象project.so 我使用以下命令 -

gcc -shared -fPIC obj_folder/*.o -o project.so

构建共享对象我看到错误消息 -

Multiple definition of foo()

我如何解决这个符号冲突并建立我的共享库?

【问题讨论】:

  • Obj1 和 Obj2 是否定义了自己的 foo 副本?如果是这样,您应该只定义一个副本(在 obj1 或 obj2 中,但不能同时在两者中),使用 extern 关键字将 foo 的原型放在标题中(并在需要时包含它)。
  • 您根本无法在一个 prog 或 lib 中定义 2 次相同的函数。你真的定义了2次吗?为什么?
  • 我稍微编辑了我的问题。我对这种情况的理解有了更多的了解。
  • 您的问题没有关于foo 的定义位置/方式的信息。
  • obj_folder 中有多少个 .o 文件?任何旧的也包括 foo()?您的 obj1 和 obj2 模块如何知道 foo() 的声明? (你不是#include-ing .cpp 文件,是吗?)

标签: c linux unix gcc shared-libraries


【解决方案1】:

foo()的多重定义
我如何解决这个符号冲突并建立我的共享库?

很遗憾,您没有提供足够的信息来回答这个问题。

您的描述似乎暗示 foo 是在 foo.o 中定义的,但如果是这样,您将不会收到您遇到的链接错误。

因此,第一步是找出foo 实际上在哪里定义。以下是这样做的秘诀:

nm -A obj_folder/*.o | grep ' foo$'

为了使链接错误有意义,应该有两个单独的.o 文件,每个文件中都定义了foo。链接您的图书馆时,您必须摆脱其中一个。

附:不要将目录称为“文件夹”。

P.P.S.像这样链接一个库:gcc ... obj_folder/*.o -o project.so 是一个非常糟糕的主意(TM)。学习和使用make

【讨论】:

  • @Emploed 俄语你能链接一些关于如何准备动态库的教程吗?顺便说一句,make 只是我非常熟悉的一种工具,但缺少有关共享库的指南。我用两个 cc 文件(目标文件)中包含的仅标头库解决了这个问题
猜你喜欢
  • 1970-01-01
  • 2017-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-28
  • 1970-01-01
相关资源
最近更新 更多