在使用静态库构建共享库时对符号进行多重定义

时间:2014-10-12 17:28:07

标签: c linux unix gcc shared-libraries

我必须从多个目标文件构建一个共享库。让我们说对象文件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()

我如何解决此符号冲突并构建我的共享librray?

1 个答案:

答案 0 :(得分:0)

  

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

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

您的说明似乎暗示foo中定义了foo.o,但如果是这样,您就不会收到链接错误。

因此,第一步是找出foo 实际定义的位置。以下是这样做的方法:

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

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

P.S。不要调用目录 a"文件夹"。

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