我必须从多个目标文件构建一个共享库。让我们说对象文件Obj1.o
和Obj2.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?
答案 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
。