Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.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
C++ Glibc的静态链接_C++_G++_Glibc_Static Linking - Fatal编程技术网

C++ Glibc的静态链接

C++ Glibc的静态链接,c++,g++,glibc,static-linking,C++,G++,Glibc,Static Linking,如何编译应用程序静态链接glibc库,但只编译应用程序所需的代码?(并非全部为lib) 现在,我的编译命令: g++ -o newserver test.cpp ... -lboost_system -lboost_thread -std=c++0x 谢谢 将-static添加到编译行。它只会添加应用程序所需的内容[当然,还有应用程序调用的任何函数,以及这些函数调用的任何函数,包括一堆启动代码和一些其他比特和片段],因此在x86机器上大约需要800K(对于一个简单的“hello world

如何编译应用程序静态链接glibc库,但只编译应用程序所需的代码?(并非全部为lib)

现在,我的编译命令:

g++  -o newserver  test.cpp ... -lboost_system -lboost_thread -std=c++0x

谢谢

-static
添加到编译行。它只会添加应用程序所需的内容[当然,还有应用程序调用的任何函数,以及这些函数调用的任何函数,包括一堆启动代码和一些其他比特和片段],因此在x86机器上大约需要800K(对于一个简单的“hello world”程序)。其他架构各不相同。由于boost可能至少会调用一点标准库,因此您的应用程序中可能会添加超过800K的内容。但它只应用最终二进制代码中任何代码使用的函数,而不是整个库(大约2MB作为共享库)

如果您只需要链接glibc,则需要将链接行修改为编译:
-Wl,-Bstatic-libc-Wl,-b动态
。这将防止任何其他库被静态链接[您有时需要有多个这样的语句,因为有时另一个库拉入的某些语句需要从glibc拉入“更多”-不要担心,它不会带来超出链接器认为必要的任何内容].

这就是
-static
所做的(如另一个答案中所述):不需要的模块不会链接到您的程序中。但你对所需的东西数量的期望(从某种意义上说,我们无法说服linker相反)可能过于乐观

如果您试图实现可移植性(在其他使用较旧的glibc或类似工具的机器上运行可执行文件),那么有一个简单的测试问题来确定您是否能够得到想要的:

您是否想到了
libnss
的问题,您确定它不会伤害您


如果你的答案是肯定的,也许继续下去是有意义的。如果答案是否定的,或者这个问题看起来太模糊,没有答案,就用静态链接的glibc退出你的到期日吧:它有更多的机会伤害而不是帮助。

这也会静态链接到boost libs和其他libs,我认为这是不需要的(但我不确定我是否理解这个问题)啊,说得好,你必须耍点小把戏才能静态链接一个库。@JonathanWakely,我需要这个,因为在客户端机器上可能是2.5、2.2版本的glibc,但我有2.7版本,我需要在所有版本的glibc(或最后两个版本)上运行我的应用程序,我如何编译才能实现这一点?谢谢!