Demo_lib.h void fun ();

Demo_lib.cpp

#include<iostream>
void fun(){
    std::cout << "I am in demo_lib::fun()" << std::endl;
}

Скомпилировал статическую библиотеку

g++ -c demo_lib.cpp -o demo_lib.o
ar rcs libdemo_lib.a demo_lib.a

Main.c

#include "demo_lib.h"
int main(){
    fun();
    return 0;
}

Скомпилированный статический

g++ -static main.cpp -L. -ldemo_lib
size of a.out is 1702697 => static linked by linker 

Скомпилирован без статики

g++ main.cpp -L. -ldemo_lib
size of a.out is 9247  => is demo_lib linked dynamically  ??

Почему тут разница в размерах ??

Я думаю, что библиотека cpp связана статически, когда мы использовали параметр компилятора -static

И когда мы этого не делаем, библиотека cpp подключается динамически, за исключением demo_lib.

В обоих случаях demo_lib связан статическим образом и только библиотека cpp diff

Можем ли мы связать статическую скомпилированную библиотеку как динамическую ??

Означает ли это, что стандартная связь стандартной библиотеки используется совместно ??

c++
1
Jagan Arikuti 20 Фев 2016 в 21:02

2 ответа

Лучший ответ

Разница в размере, которую вы видите между --static и нет, заключается в том, что функции стандартных библиотек C и C ++ связаны и не связаны. Таким образом, разница в размере не зависит от ВАШЕЙ библиотеки (которая предположительно составляет всего несколько сотен байтов, учитывая, что это всего лишь пара вызовов cout::operator<<(), и они должны выдавать только около дюжины инструкций [при условии x86, но на ARM или MIPS это будет не более 20-25 инструкций для всего вашего кода ].

И нет, вы не можете связать общую библиотеку как таковую статически, и вы не можете связать статическую библиотеку как общую - это разные файлы с разным содержимым. Когда вы используете --static, компилятор (или компоновщик) предпочтет X.a по сравнению с X.so [при условии, что оба существуют].

Добавление -Wl,--verbose покажет вам точно [или, по крайней мере, намного больше деталей, чем без], что делает компоновщик, когда вы связываете вашу программу, и довольно четко покажет разницу между с --static и без него. С --static вы получите целую кучу строк вроде:

(/usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../../../lib64/libc.a)read.o

Указывая, в данном случае, что функция read [которая лежит в основе таких вещей, как fread, scanf, cin::operator>> и т. д.].

Конечно, вы также можете использовать objdump -d, например, чтобы увидеть, какой код связан с вашим приложением.

4
Mats Petersson 20 Фев 2016 в 18:46

Помимо отличного ответа Матса Петерссона, есть хороший инструмент для проверки, сколько библиотек связано динамически, просто введите

> ldd a.out

И вывод будет содержать все общие библиотеки, с которыми связано ваше приложение

1
Severin Pappadeux 20 Фев 2016 в 23:58