当编译我们的项目,我们创建几个档案(静态库),说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()
。
g++ x.o -L. -lyz -o xyz
但是,当我直接将最终的可执行文件与归档文件(静态库)链接时,它可以工作。
g++ x.o -L. -ly -lz -o xyz
我的猜测是,归档中包含的目标文件未 链接 到共享库中,因为它们没有在共享库中使用。如何强制包容?
编辑:
可以使用–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)):
--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.
(gcc -Wl,-完整档案)
另外,您应该-Wl,--no-whole-archive
在库列表的末尾。(如德米特里·尤达科夫在下面的评论中所述)
我有一个定义网络结构的对象,我想发送该对象的所有子对象和子对象的子对象,等等。 现在我有这个: 这段代码将获得大部分级别,但如果网络有许多不同的层,则不会获得所有级别。我如何才能使其包含所有层。
本文向大家介绍window.location 对象所包含的属性,包括了window.location 对象所包含的属性的使用技巧和注意事项,需要的朋友参考一下 hash//从井号 (#) 开始的 URL(锚) host//主机名和当前 URL 的端口号 hostname//当前 URL 的主机名 href//完整的 URL pathname//当前 URL 的路径部分 port//当前 URL 的
问题内容: 如何Foo从Java访问包对象中包含的对象? 问题答案: 也许从Scala 2.8.1开始,这已经发生了变化,但是该提议不起作用。您必须使用。 对于对象,方法等,它有所不同。考虑到scala类: 您可以访问foo,bar而baz在Java中,如: 当我试图弄清楚这一点时,我以为我们遇到了麻烦,因为Scala生成了一个名为的类,当然您不能在Java中导入该类。幸运的是,我们只需要pack
我正在尝试将Firebase DataSnapshot对象保存到SharedReferences。 请看这篇文章,我在其中设计了一种方法来实现这一点。 ... 到目前为止,我已经尝试了: > 使用Gson。Json方法。结果:似乎不起作用。。。我不认为DataSnapshot类是“POJO”类型的类。。。至少没有一个能与gson合作。 使用此方法: 私有静态字符串toString(可序列化o)引发
共享内存用于实现进程间大量的数据传输。 共享内存空间是在内存中单独开辟的一段内存空间。这段空间有自己特有的数据结构,包括访问权限、大小和最近访问时间等。 重要的数据结构 shmid_ds /*位于/usr/include/linux/shm.h*/ struct shmid_ds { struct ipc_perm shm_perm; /* 操作权限 */ in
问题内容: 好的,这是一个棘手的问题。我有一套清单。我想按顺序对集合中的对象进行排序。 想象每个场景都压抑着学校的一堂课。每个集合包含人物对象。人员对象具有名称的字符串值。在遍历并写下来之前,我想按名称排列集合中的人物。 是否有任何使用或类似的方法可以实现此目的? 我确实知道班上2个以上的孩子可能使用相同的名字,但请忽略此 问题答案: A 没有 排序的 概念,因为它是一个集合。 您可以使用按类实现