Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何在共享对象中包含存档的所有对象?_Linux_Gcc_Linker_Archive - Fatal编程技术网

Linux 如何在共享对象中包含存档的所有对象?

Linux 如何在共享对象中包含存档的所有对象?,linux,gcc,linker,archive,Linux,Gcc,Linker,Archive,在编译我们的项目时,我们创建了几个档案(静态库),比如liby.a和libz.a,每个档案都包含一个定义函数y_function()和z_function()的对象文件。然后,这些档案被加入到一个共享对象中,比如说libyz.so,这是我们主要的可分发目标之一 g++ -fPIC -c -o y.o y.cpp ar cr liby.a y.o g++ -fPIC -c -o z.o z.cpp ar cr libz.a z.o g++ -shared -L. -ly -lz -o li

在编译我们的项目时,我们创建了几个档案(静态库),比如
liby.a
libz.a
,每个档案都包含一个定义函数
y_function()
z_function()
的对象文件。然后,这些档案被加入到一个共享对象中,比如说
libyz.so
,这是我们主要的可分发目标之一

g++  -fPIC  -c -o y.o y.cpp
ar cr liby.a y.o
g++  -fPIC  -c -o z.o z.cpp
ar cr libz.a z.o
g++ -shared -L. -ly -lz -o libyz.so
在示例程序中使用此共享对象时,例如
x.c
,由于未定义对函数
y_function()
z_function()
的引用,链接将失败

但是,当我将最终的可执行文件直接链接到归档文件(静态库)时,它就可以工作了

我的猜测是,归档文件中包含的对象文件没有链接到共享库中,因为它们没有在共享库中使用。如何强制包容

编辑:

可以使用--whole archive
ld
选项强制包含。但如果导致编译错误:

g++ -shared '-Wl,--whole-archive' -L. -ly -lz -o libyz.so
/usr/lib/libc_nonshared.a(elf-init.oS): In function `__libc_csu_init':
(.text+0x1d): undefined reference to `__init_array_end'
/usr/bin/ld: /usr/lib/libc_nonshared.a(elf-init.oS): relocation R_X86_64_PC32 against undefined hidden symbol `__init_array_end' can not be used when making a shared object
/usr/bin/ld: final link failed: Bad value
你知道这是从哪里来的吗?

你可以试试(ld(2)):

(gcc-Wl,整个档案)


另外,您应该将
-Wl,--no-whole archive
放在库列表的末尾。(正如Dmitry Yudakov在下面的评论中所说的)

谢谢,这看起来像我正在寻找的,但它会产生一个链接错误,我不知道它来自哪里。我在问题中添加了详细信息。
manld
中有关于此选项的重要说明:不要忘记在您的归档列表之后使用-Wl,-不使用整个归档,因为gcc将向您的链接添加其自己的归档列表,您可能不希望此标志也影响这些内容
g++ x.o -L. -ly -lz -o xyz
g++ -shared '-Wl,--whole-archive' -L. -ly -lz -o libyz.so
/usr/lib/libc_nonshared.a(elf-init.oS): In function `__libc_csu_init':
(.text+0x1d): undefined reference to `__init_array_end'
/usr/bin/ld: /usr/lib/libc_nonshared.a(elf-init.oS): relocation R_X86_64_PC32 against undefined hidden symbol `__init_array_end' can not be used when making a shared object
/usr/bin/ld: final link failed: Bad value
   --whole-archive
       For each archive mentioned on the command line after the --whole-archive option, include every object file in the
       archive in the link, rather than searching the archive for the required object files.  This is normally used to turn
       an archive file into a shared library, forcing every object to be included in the resulting shared library.  This
       option may be used more than once.