【发布时间】:2014-12-07 07:21:21
【问题描述】:
我必须从多个目标文件构建一个共享库。假设对象文件 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()
我如何解决这个符号冲突并建立我的共享库?
【问题讨论】:
-
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