您好我正在尝试从目标文件列表和.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
答案 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.o
和filemode.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.a
与https://www.youtube.com/watch?v=ouDmKW1FGjo
联系起来毫无意义。但是,如果你坚持的规则
首先链接目标文件,之后链接库,然后通过拥有库不会造成任何伤害
在不需要的联系中。不需要的库将不会给程序增加任何内容
或您正在链接的共享库。