c - 使用静态库构建共享库时符号的多重定义

标签 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()

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

最佳答案

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/

相关文章:

linux - 如何通过linux脚本识别文件是否仍在写入或完成

linux - 如何检查 UPnP 服务器是否正在运行?

linux - 如何使用与我在 cron 作业中使用的环境相同的环境?

c - 在 C 中反序列化文本文件数据(链表)

c++ - 从给定日期开始的星期几

c - 在 C 中进行毫秒倒计时的最简单方法?

linux - 如何在将标准输出重定向到 Bash 文件时添加时间戳?

linux - 运行以 .pl 结尾的 perl 脚本

linux - 如何用sed用字符/字符串替换空行

c++ - 如何在 C 或 C++ 的 O(n) 中删除数组中的重复元素?