做循环静态链接的LIB会导致更大的输出尺寸
Do circularly static linked libs result in a bigger output size?
我在C 中有多个静态库。例如:
- lib a
- lib b
- lib c
lib a 使用 lib c 和 lib c 使用 a 和 b 两者都使用。我们在LIB之间具有循环依赖性。因为它们是静态液体的,如果它们是圆形的,则它们的输出尺寸更大,因为它们都包含在 b 中。 a 包含在 c 和 c 中,代码在 b 中两次:(
有人可以向我解释这是如何工作的吗?
,如果 a , b 和 c 将链接到 d 将是 c 内部 d 也两次?
输出尺寸是否更大[链接多次时]?
no,可执行文件的输出大小不会随您的libs的顺序而变化,也不会随您指定libs的次数。
有人可以向我解释这是如何工作的吗?
创建可执行文件(而不是库)时:链接器通常在*.o
文件粒度上链接,这意味着A *.o文件是否包含在可执行文件中。但是每个*.o
文件仅包含在可执行文件中一次。这就是为什么大小没有差异的原因,即使您将lib链接了三遍。
,如果a,b和c将链接到d 也两次?
静态库通常不会连接在一起。它们只是作为新的ar
存档一起重新包装。而且,与可执行的情况一样,每个 *.o文件仅存在新库(新的ar
存档)中,因此即使您直接或间接添加了两次库,大小也不会变大。
降低可执行文件的大小:如果您担心可执行文件的大小并且正在使用GCC或LLVM,则有一种很好的方法可以减少它:
-
告诉GCC将每个单独的功能都放入一个单独的部分:
-ffunction-sections
-
然后告诉链接到垃圾夹(丢弃)未使用的部分:
-Wl,--gc-sections
令人惊讶的是,这不是默认值。如果没有这些选项,则在该*.o
文件中的至少一件事中引用了整个*.o
文件。未使用的*.o
文件也始终被丢弃(除非提供了特定的选项),否则在功能级别上没有。
链接动态库(共享对象,DSO,无论您想称呼它们)再次是Unix系统上的另一件事,更复杂。
库在彼此之间不会静态链接;他们静态地链接到可执行文件。
因此,库彼此指的是什么都没关系。 lib a 永远不会包含 lib c 的副本(除了代码内部的可能性)。
构建可执行文件时,您的链接器也将仅拉一次。
但是,所述可执行文件将比您动态地链接这些库,而您使用相同库的所有其他可执行文件也将拥有自己的副本。那是在这里考虑的层。
- 递归函数计算序列中的平方和(并输出过程)
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 请解释"函数1(p1,p2,p3);"的输出
- #为""定义宏;静态";针对不同的上下文
- C++:将控制台输出存储在宏中更好吗
- cmake如何在fedora工作站中找到boost静态库包
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 使用静态变量的递归调用的不同输出
- 在静态库中使用输出迭代器时出现链接器错误
- OpenGL:计算着色器 - gl_GlobalInvocationID提供静态输出
- 做循环静态链接的LIB会导致更大的输出尺寸
- 当在函数内部使用静态变量时,输出会发生变化,该函数在c++中返回引用
- 使用 COUT 的 C++ 静态方法输出始终为 1
- 带有静态对象的奇怪输出
- 无法将外部git-CMake项目的输出(静态库)链接到CMake项目
- Visual Studio 11终极静态分析显示没有输出
- LDD输出静态链接在共享库上
- 为什么英特尔编译器产生的输出需要libiomp5mt.dll,即使我要求静态链接
- 静态函数输出不同于普通fn输出