格利布的静态链接
Static linking of Glibc
如何编译我的应用程序静态链接glibc库,但只有我的应用程序所需的代码?(不是全部库)
现在我的编译命令:
g++ -o newserver test.cpp ... -lboost_system -lboost_thread -std=c++0x
谢谢!
这就是
-static
的作用(如另一个答案中所述):不需要的模块不会链接到您的程序中。但是你对所需东西数量的期望(从某种意义上说,我们无法说服链接者相反)可能过于乐观。
如果你试图这样做是为了可移植性(在其他具有较旧 glibc 或类似内容的机器上运行可执行文件),有一个简单的测试问题来查看您是否会得到你想要的东西:
你有没有想到libnss
的问题,你确定它不会咬你吗?
如果你的答案是肯定的,也许继续下去是有意义的。如果答案是否定的,或者问题看起来太晦涩而没有答案,只需使用静态链接的glibc退出过期:它伤害的机会大于帮助。
将-static
添加到编译行。它只会添加您的应用程序需要的内容[当然,您的应用程序调用的任何函数,以及这些函数调用的任何函数,包括一堆启动代码和其他一些零碎的东西],因此它将在 x86 机器上大约 800K(对于简单的"hello world"程序)。其他体系结构各不相同。由于 boost 可能至少还会调用标准库一点点,因此您的应用程序可能会添加超过 800K。但它只应用最终二进制文件中任何代码使用的函数,而不是整个库[大约 2MB 作为共享库]。
如果你只想要链接glibc,你需要修改编译的链接行为: -Wl,-Bstatic -libc -Wl,-Bdynamic
.这将防止任何其他库被静态链接[你有时需要有多个这样的语句,因为有时由另一个库拉入的东西需要从glibc中提取"更多"的东西 - 别担心,它不会带来任何超过链接器认为必要的内容]。
相关文章:
- 基于boost的程序的静态链接——zlib问题
- 使用gcc从静态链接的文件中查找可选符号
- 使用转换器提升 Python 问题 - 静态链接
- C++实用程序::转换在静态链接库中不起作用
- 将源中的 GLEW 与 cmake 静态链接
- 在发布模式下启动使用库的静态链接编译的应用程序时出错
- libavdevice 和 x11 的静态链接库应该以什么顺序链接?
- 静态链接启用 PIC 的库时出现链接器 PIC 错误
- 静态链接库时,收到链接器错误:找不到 -lgcc_s
- 静态链接 glibc & boost_python36 for Python extension
- 我可以在C++中配置静态链接吗?
- 协议缓冲区的静态链接会导致与现有符号冲突
- C++标准是否定义了结构中成员函数的函数内定义是否必须具有静态链接?
- 静态链接 Visual Studio dll 到动态链接的 sfml 项目
- 我可以加载与库静态链接的 dll 吗?
- 静态链接MSVC库,动态链接Qt
- C++:找不到静态链接
- OpenSSL AES仅适用于某些计算机,即使具有静态链接也是如此
- CURL 静态链接未解析的外部符号
- 如何强制Windows.h在Visual Studio中静态链接而不是动态链接?