Mik*_*han 11
在GCC手册,链接选项说:
-static-的libstdc ++
当g ++程序用于链接C++程序时,它通常会自动链接到libstdc ++.如果libstdc ++作为共享库提供,并且未使用-static选项,那么这将链接到libstdc ++的共享版本.这通常很好.但是,冻结程序使用的libstdc ++版本有时很有用,而不会一直到完全静态链接.-static-libstdc ++选项指示g ++驱动程序静态链接libstdc ++,而不必静态链接其他库.
这清楚地表明该选项-static-libstdc++仅对g++编译器驱动程序有意义,而不是gcc任何其他选项.
另一方面,该选项-l<name>是有意义的,对所有GCC编译器驱动程序来说意味着相同的事情.在此基础上,这并不奇怪:
gcc file.cc -lstdc++ -static-libstdc++
Run Code Online (Sandbox Code Playgroud)
具有与以下相同的含义:
gcc file.cc -lstdc++
Run Code Online (Sandbox Code Playgroud)
但是,这种观察并没有真正说明为什么这些命令行中的第一个动态链接libstdc++:
-static-libstdc++仅对g++因为只有g++链接
libstdc++自动有意义.因此g++,问题出现的问题是自动链接libstdc++是动态版本还是静态版本.动态版本是默认版本:-static-libstdc++
坚持使用静态版本.
该自动链接 libstdc++的g++方式是:g++默默地追加-lstdc++到任何链接选项您指定(有不少其他锅炉板的一个C++联动一起).您可以通过请求详细链接(g++ ... -Wl,-v ...)来显示所有样板.
就其本身而言,附加内容-lstdc++将导致链接器libstdc++根据其默认行为链接动态版本.唯一的区别
-static-libstdc++是,在以-lstdc++其他方式无声地传递给链接器的地方,选项:
-Bstatic -lstdc++ -Bdynamic
Run Code Online (Sandbox Code Playgroud)
而是默默地传递给它.这些告诉链接器:
-Bstatic:在进一步通知之前,请勿链接动态库-lstdc++:链接 libstdc++-Bdynamic:链接动态库,直到另行通知.您可以看到如何保护静态链接,libstdc++而不会对任何其他库的链接产生副作用.
但是您也可以看到,libstdc++动态或静态的自动链接对您自己指定的任何库的链接没有追溯效果.
因此,如果您的链接已经包含-lstdc++在编译器驱动程序静默附加任何样板选项之前,那么libstdc++将以与-l<name>链接序列中该位置的任何方式相同的方式链接.如果无声地附加锅炉板选项导致在-lstdc++
链接序列中稍后再次出现,无论是单独还是周围环境:
-Bstatic -lstdc++ -Bdynamic
Run Code Online (Sandbox Code Playgroud)
然后后面的外观将是多余的,因为库已经被链接.
因此gcc,结果没有什么特别之处:
gcc file.cc -lstdc++ -static-libstdc++
Run Code Online (Sandbox Code Playgroud)
制造程序,其中libstdc++被动态地链接.那样做
g++ file.cc -lstdc++ -static-libstdc++
Run Code Online (Sandbox Code Playgroud)
或者确实:
g++ file.cc -static-libstdc++ -lstdc++
Run Code Online (Sandbox Code Playgroud)
因为生成的链接器命令行具有以下形式:
... file.o -lstdc++ ... -Bstatic -lstdc++ -Bdynamic ...
Run Code Online (Sandbox Code Playgroud)
哪里-Bstatic -lstdc++ -Bdynamic太晚了,没有任何区别.
看看这个:
file.cc
#include <iostream>
int main()
{
std::cout << "Hello World" << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
正常编译和链接并检查动态依赖关系ldd:
$ g++ -o prog file.cc
$ ldd prog
linux-vdso.so.1 => (0x00007ffede76a000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f42fa74c000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f42fa385000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f42fa07c000)
/lib64/ld-linux-x86-64.so.2 (0x0000558ab42bc000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f42f9e65000)
Run Code Online (Sandbox Code Playgroud)
libstdc++.so 存在.
现在只需-static-libstdc++:
$ g++ -o prog file.cc -static-libstdc++
$ ldd prog
linux-vdso.so.1 => (0x00007fff448d7000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fe5f7c71000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe5f78aa000)
/lib64/ld-linux-x86-64.so.2 (0x0000556ebf272000)
Run Code Online (Sandbox Code Playgroud)
libstdc++.so 缺席.
最后-static-libstdc++ -lstdc++:
$ g++ -o prog file.cc -static-libstdc++ -lstdc++
$ ldd prog
linux-vdso.so.1 => (0x00007ffd12de9000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fd5a1823000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd5a145c000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fd5a1153000)
/lib64/ld-linux-x86-64.so.2 (0x000055bbe31c3000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fd5a0f3c000)
Run Code Online (Sandbox Code Playgroud)
libstdc++.so 回来了.
(当然,这是Linux,但你会在Windows上找到相同的东西).
所以,无论你是用它驱动你的联系,g++还是gcc原因
{gcc|g++} file.cc -lstdc++ ...
Run Code Online (Sandbox Code Playgroud)
将导致libstdc++动态链接就是这样
{gcc|g++} file.cc -lfoo ...
Run Code Online (Sandbox Code Playgroud)
将导致libfoo动态链接,如果它可以,不管是什么...,只提供...不包含选项-static.
| 归档时间: |
|
| 查看次数: |
5546 次 |
| 最近记录: |