我必须从多个目标文件构建一个共享库。假设目标文件 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()
我如何解决此符号冲突并构建我的共享库?
最佳答案
Multiple definition of foo()
How i can resolve this symbol collision and build my shared librray?
遗憾的是,您没有提供足够的信息来回答该问题。
您的描述似乎暗示 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
。
关于c - 使用静态库构建共享库时符号的多重定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26327936/