2016-02-20 2 views
1

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 ?? 

почему разница в размерах здесь ??

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

И когда мы не CPP библиотеки динамически компонуется кроме demo_lib.

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

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

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

+0

Возможный дубликат [Когда использовать динамические и статические библиотеки] (http://stackoverflow.com/questions/140061/when-to-use-dynamic-vs-static-libraries) – SevenBits

+0

Я не согласен с тем, что это хорошо dupe, этот вопрос касается WHY, размер исполняемого файла такой же, как и в разных библиотечных формах. –

ответ

4

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

И нет, вы не можете связывать общую библиотеку как таковую статически, и вы не можете связывать статическую библиотеку как общую - это разные файлы с различным контентом. Когда вы используете --static, компилятор (или компоновщик) выбирает X.a предпочитают ence свыше 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, чтобы узнать, какой код указан в вашем приложении, например.

1

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

> ldd a.out 

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

Смежные вопросы