我首先编译了两个目标文件(.o):
他们都定义了一个函数memcpy()
。现在,我想用:
gcc -shared -o test.so string-memcpy.o machine-memcpy.o
由于“memcpy
”的多重定义,此操作失败。有没有办法做到这一点 ?谢谢!
实际上,当我尝试为libc(newlib-1.16)编译共享库时,我遇到了这个问题。我只能在Internet上找到如何从中构建静态库。因此,任何关于如何实现这一点的提示都表示赞赏。
答案 0 :(得分:0)
静态库只是一个包含.o文件的'.ar'文件(tar的原始前身)。过程中涉及的任何内容都不知道或关心是否存在符号冲突。如果.ar文件中的多个.o文件包含相同的符号,则链接器将选择它看到的第一个.o文件。如果它稍后尝试使用另一个.o文件来满足另一个符号,则会出错。
另一方面,共享库是链接器输出,链接器不愿意创建具有重复符号名称的文件。
ld
有一些复杂的选项可能会让你解决这个问题,但它们也可能会让你的问题变得更糟。