2017-08-02 63 views
0

嗨我想从对象文件和.a文件的列表中创建一个如此的文件。但我收到错误。这是下面的命令和错误。从静态库列表创建共享库

gcc -g -shared bucomm.o filemode.o libiberty.a version.o make-temp-file.o -o liballshared.so 

make-temp-file.o: In function `choose_tmpdir': 
/home/dinesh/packages/binutils-2.29/libiberty/./make-temp-file.c:106: multiple definition of `choose_tmpdir' 
libiberty.a(make-temp-file.o):/home/dinesh/packages/binutils-2.29/libiberty/./make-temp-file.c:106: first defined here 
make-temp-file.o: In function `make_temp_file': 
/home/dinesh/packages/binutils-2.29/libiberty/./make-temp-file.c:185: multiple definition of `make_temp_file' 
libiberty.a(make-temp-file.o):/home/dinesh/packages/binutils-2.29/libiberty/./make-temp-file.c:185: first defined here 
collect2: error: ld returned 1 exit status 
+0

Sooooo ...你期待什么?它告诉你一些你的对象有些功能的定义有冲突。 – spectras

+0

我从命令中删除了libiberty.a并编译。我无法弄清楚问题是什么 –

回答

0

我无法弄清楚哪些问题是

这里:

make-temp-file.o: In function `choose_tmpdir': 
/home/dinesh/packages/binutils-2.29/libiberty/./make-temp-file.c:106: multiple definition of `choose_tmpdir' 

链接告诉您该目标文件make-temp-file.o定义一个函数choose_tmpdir是 有已经在已经链接的目标文件中定义。链接器不允许 您链接choose_tmpdir的多个定义。你应该在你的liballshared.so中链接哪个定义?

下一页:

libiberty.a(make-temp-file.o):/home/dinesh/packages/binutils-2.29/libiberty/./make-temp-file.c:106: first defined here 

链接器告诉你,静态库libiberty.a对象文件make-temp-file.o是在choose_tmpdir已经定义它 已链接的目标文件。

下一页:

make-temp-file.o: In function `make_temp_file': 
/home/dinesh/packages/binutils-2.29/libiberty/./make-temp-file.c:185: multiple definition of `make_temp_file' 
libiberty.a(make-temp-file.o):/home/dinesh/packages/binutils-2.29/libiberty/./make-temp-file.c:185: first defined here 

链接告诉你,你也有功能make_temp_file,这也是make-temp-file.o定义 并已在make-temp-file.o先前从内联 也已经定义了多个定义静态库libiberty.a

这两多个定义错误的发生,因为在你的联动指挥:

gcc -g -shared bucomm.o filemode.o libiberty.a version.o make-temp-file.o -o liballshared.so 

你先放弃链接库libiberty.a,其中包含目标文件make-temp-file.o, 然后你给的链接make-temp-file.o一次。

当您给链接器一个目标文件时,它将无条件链接到您的程序或共享libarary中。当您将 连接器设置为静态库时,它会检查静态库中的对象文件,只提取它需要的对象文件并将它们链接到您的程序或共享库中。链接器需要来自静态库 的目标文件,如果该目标文件在其已经链接的目标文件中提供了一个或多个已被引用但尚未定义的符号的定义。

当链接到达libiberty.a在你的命令行,它会检查库 对象文件,看其中是否在目标文件中引用的未定义符号 提供定义,它已经链接到您的liballshared.so(即bucomm.ofilemode.o)。 它发现libiberty.a(make-temp-file.o)提供用于功能choose_tmpdirmake_temp_file,它需要定义。因此它从libiberty.a中提取make-temp-file.o并将其链接到您的共享库中。

当它到达你的命令行make-temp-file.o,它无条件地连接它。所以这个目标文件有 现在在你的共享库被挂两次,它定义符号已在您的共享库被定义两次, 所以你的链接失败。

您的联系将失败的命令:

gcc -g -shared bucomm.o filemode.o version.o make-temp-file.o libiberty.a -o liballshared.so 

其中libiberty.a来自所有目标文件后。在检查libiberty.a之前,所有目标文件都将被无条件链接, 。并且当检查libiberty.a时,链接器 将而不是摘录和链接libiberty.a(make-temp-file.o)因为它不需要

道德:链接目标文件第一,图书馆事后

您发表评论,如果您删除libiberty.a你完全联动成功。如果这是真的,它 告诉你所有在你的共享库中引用的符号被定义在bucomm.o filemode.o version.o make-temp-file.o, 之一中,所以在链接libiberty.a开始时没有任何意义。但是,如果你坚持的 链接目标文件的规则首先,库之后,则没有伤害会被具有库中不需要的联动 完成。不需要的库将不会向您正在链接的程序 或共享库添加任何内容。

+0

非常感谢。它是一个非常明确的解释。帮了我很多。 –

+0

@DineshGowda欢迎来到Stackoverflow!您可能会喜欢阅读[当某人回答我的问题时该怎么办](https://stackoverflow.com/help/someone-answers) –