从静态库列表创建共享库

时间:2017-08-02 07:05:06

标签: gcc g++ shared-libraries static-libraries

您好我正在尝试从目标文件列表和.a文件创建一个so文件。但我得到错误。以下是命令和错误。

 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

1 个答案:

答案 0 :(得分: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

链接器告诉您静态库make-temp-file.o中的目标文件libiberty.a是它具有的目标文件 已经定义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

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

当链接器到达命令行中的libiberty.a时,它会检查 库中的目标文件,以查看它们中是否有任何未定义符号的定义 在目标文件中引用它已链接到您的liballshared.so(即bucomm.ofilemode.o)。 它发现libiberty.a(make-temp-file.o)提供了函数choose_tmpdir的定义 make_temp_file,它需要它。因此,它会从make-temp-file.o中提取libiberty.a并将其链接到您的共享库中。

当它在命令行中到达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.ahttps://www.youtube.com/watch?v=ouDmKW1FGjo联系起来毫无意义。但是,如果你坚持的规则 首先链接目标文件,之后链接库,然后通过拥有库不会造成任何伤害 在不需要的联系中。不需要的库将不会给程序增加任何内容 或您正在链接的共享库。