为什么在使用静态库进行编译之后可执行文件增长如此之多?
问题描述:
我刚才试图编译静态libboost系统库我的小测试应用程序,例如:为什么在使用静态库进行编译之后可执行文件增长如此之多?
$ g++ -I ~/lib/boost-1.56/include main.cpp -o main -L~/lib/boost-1.56/lib/ -static -lboost_system
在此之前,我已经编译没有静态库:
$ g++ -I ~/lib/boost-1.56/include main.cpp -o main -L~/lib/boost-1.56/lib/ -lboost_system
的大小差异的方法大于库版本之间的大小差异:
- 动态链接 - 40K
- 静态链接 - 1.6M
libboost图书馆~/lib/boost-1.56/lib
-rw-rw-r-- 1 USER USER 218K sie 31 14:44 libboost_filesystem.a
lrwxrwxrwx 1 USER USER 29 sie 31 14:43 libboost_filesystem.so -> libboost_filesystem.so.1.56.0
-rwxrwxr-x 1 USER USER 115K sie 31 14:43 libboost_filesystem.so.1.56.0
-rw-rw-r-- 1 USER USER 49K sie 31 14:44 libboost_system.a
lrwxrwxrwx 1 USER USER 25 sie 31 14:43 libboost_system.so -> libboost_system.so.1.56.0
-rwxrwxr-x 1 USER USER 20K sie 31 14:43 libboost_system.so.1.56.0
为什么会出现在大小如此巨大的差异?
答
静态库意味着它不是链接到外部库文件的可执行文件(在Windows上它们是DLL),它们现在被集成到您的实际可执行文件中。如果您不想单独分发DLL,这是一件好事,但它也完全浪费了DLL的好处,例如能够单独交换它们,而不是重新分发所有应用程序,以及让多个应用程序只使用存储在系统中一个地方的通用代码。
考虑到Boost有多大,你的可执行文件有多大就不足为奇了。