从静态库列表创建共享库
Creating a shared library from list of 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
I am not able figure out what the issue is
这里:
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'
linker 告诉你目标文件 make-temp-file.o
定义了一个函数 choose_tmpdir
已在已 linked 的目标文件中定义。 linker 不允许
您 link 多个 choose_tmpdir
的定义。在你的 liballshared.so
中应该 link 是哪个定义?
下一个:
libiberty.a(make-temp-file.o):/home/dinesh/packages/binutils-2.29/libiberty/./make-temp-file.c:106: first defined here
那个linker告诉你静态库make-temp-file.o
里面的object文件libiberty.a
就是它有的object文件
已经 linked 其中已经定义了 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
linker 告诉你,你还有一个函数的多重定义 make_temp_file
,这也是
在 make-temp-file.o
中定义并且在 make-temp-file.o
之前 linked 时也已经定义
来自静态库 libiberty.a
.
这两个多重定义错误的发生是因为在您的 linkage 命令中:
gcc -g -shared bucomm.o filemode.o libiberty.a version.o make-temp-file.o -o liballshared.so
你首先给 linker 库 libiberty.a
,其中包含目标文件 make-temp-file.o
,
然后你再给 linker make-temp-file.o
。
当你给 linker 一个对象文件时,它 link 将它无条件地保存在你的程序或共享库中。当你给
linker 一个静态库,它检查静态库中的目标文件,只提取那些
它需要并 link 将它们放入您的程序或共享库中。 linker 需要来自静态库的目标文件
如果目标文件提供了一个或多个已被引用的符号的定义,但没有
尚未定义,在它已经 linked 的目标文件中。
当 linker 在您的命令行中到达 libiberty.a
时,它会检查
库中的目标文件以查看它们是否提供未定义符号的定义
在对象文件中引用它已经 link 编辑到您的 liballshared.so
中(即 bucomm.o
和 filemode.o
)。
它发现 libiberty.a(make-temp-file.o)
为函数 choose_tmpdir
提供了定义,并且
make_temp_file
,这是它需要的。因此它从 libiberty.a
中提取 make-temp-file.o
并将其 link 保存在您的共享库中。
当它在您的命令行中到达 make-temp-file.o
时,它会无条件地 link 执行它。所以这个目标文件有
现在在您的共享库中被 link 编辑了两次,并且它定义的符号已经在您的共享库中定义了两次,
所以你的 linkage 不合格。
您的 linkage 将不会失败并显示命令:
gcc -g -shared bucomm.o filemode.o version.o make-temp-file.o libiberty.a -o liballshared.so
其中 libiberty.a
在所有目标文件之后。所有目标文件都将被 linked,
无条件地,在检查 libiberty.a
之前。当检查 libiberty.a
时, linker
不会提取和link libiberty.a(make-temp-file.o)
因为不需要。
道德:Link 首先是对象文件,然后是库。
您评论说,如果您完全删除 libiberty.a
,您的 linkage 就成功了。如果这是真的,那
告诉您共享库中引用的 所有 符号在 bucomm.o filemode.o version.o make-temp-file.o
之一中定义,
所以 linking libiberty.a
是没有意义的。但如果你坚持规则
link先是目标文件,然后是库,那么拥有库就没有什么坏处了
在不需要的 link 年龄。不需要的库不会给程序添加任何内容
或您正在 linking.
的共享库
您好,我正在尝试从目标文件列表和 .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
I am not able figure out what the issue is
这里:
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'
linker 告诉你目标文件 make-temp-file.o
定义了一个函数 choose_tmpdir
已在已 linked 的目标文件中定义。 linker 不允许
您 link 多个 choose_tmpdir
的定义。在你的 liballshared.so
中应该 link 是哪个定义?
下一个:
libiberty.a(make-temp-file.o):/home/dinesh/packages/binutils-2.29/libiberty/./make-temp-file.c:106: first defined here
那个linker告诉你静态库make-temp-file.o
里面的object文件libiberty.a
就是它有的object文件
已经 linked 其中已经定义了 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
linker 告诉你,你还有一个函数的多重定义 make_temp_file
,这也是
在 make-temp-file.o
中定义并且在 make-temp-file.o
之前 linked 时也已经定义
来自静态库 libiberty.a
.
这两个多重定义错误的发生是因为在您的 linkage 命令中:
gcc -g -shared bucomm.o filemode.o libiberty.a version.o make-temp-file.o -o liballshared.so
你首先给 linker 库 libiberty.a
,其中包含目标文件 make-temp-file.o
,
然后你再给 linker make-temp-file.o
。
当你给 linker 一个对象文件时,它 link 将它无条件地保存在你的程序或共享库中。当你给 linker 一个静态库,它检查静态库中的目标文件,只提取那些 它需要并 link 将它们放入您的程序或共享库中。 linker 需要来自静态库的目标文件 如果目标文件提供了一个或多个已被引用的符号的定义,但没有 尚未定义,在它已经 linked 的目标文件中。
当 linker 在您的命令行中到达 libiberty.a
时,它会检查
库中的目标文件以查看它们是否提供未定义符号的定义
在对象文件中引用它已经 link 编辑到您的 liballshared.so
中(即 bucomm.o
和 filemode.o
)。
它发现 libiberty.a(make-temp-file.o)
为函数 choose_tmpdir
提供了定义,并且
make_temp_file
,这是它需要的。因此它从 libiberty.a
中提取 make-temp-file.o
并将其 link 保存在您的共享库中。
当它在您的命令行中到达 make-temp-file.o
时,它会无条件地 link 执行它。所以这个目标文件有
现在在您的共享库中被 link 编辑了两次,并且它定义的符号已经在您的共享库中定义了两次,
所以你的 linkage 不合格。
您的 linkage 将不会失败并显示命令:
gcc -g -shared bucomm.o filemode.o version.o make-temp-file.o libiberty.a -o liballshared.so
其中 libiberty.a
在所有目标文件之后。所有目标文件都将被 linked,
无条件地,在检查 libiberty.a
之前。当检查 libiberty.a
时, linker
不会提取和link libiberty.a(make-temp-file.o)
因为不需要。
道德:Link 首先是对象文件,然后是库。
您评论说,如果您完全删除 libiberty.a
,您的 linkage 就成功了。如果这是真的,那
告诉您共享库中引用的 所有 符号在 bucomm.o filemode.o version.o make-temp-file.o
之一中定义,
所以 linking libiberty.a
是没有意义的。但如果你坚持规则
link先是目标文件,然后是库,那么拥有库就没有什么坏处了
在不需要的 link 年龄。不需要的库不会给程序添加任何内容
或您正在 linking.