2015-02-16 3 views
2

У меня есть следующие файлы: help.cpp help.h help.o main.cpp , и я хочу создать статическую библиотеку.Компиляция vs Статическая связь

help.cpp

#include <iostream> 
#include "help.h" 

using namespace std; 

void hello() 
{ 
cout << "hi" << endl; 
} 

help.h

#ifndef HELP_H 
#define HELP_H 

void hello(); 

#endif 

main.cpp

#include <iostream> 
#include "help.h" 

using namespace std; 

int main() 
{ 
hello(); 
return 0; 
} 

Чтобы создать статическую LIB:

  1. ar rcs libST.a help.o

  2. g++ main.cpp -L . -l ST #to create my binary

    Я побежал, он распечатывается

    hi 
    
  3. Я подумал, почему бы не сделать как это: g++ main.cpp libST.a, и это сработало.

Скажите, пожалуйста, какая разница между командами 2 и 3?

+0

Название немного запутанно, любые другие предложения? – Oleg

ответ

2

Поведение обоих будет (почти) идентичным в этом случае, но есть несколько отличий.

g++ main.cpp -L . -l ST 

компилируется main.cpp и попытки связать его с чем-то под названием libST. Это будет искать весь путь поиска компоновщика (обычно/usr/local/lib,/lib и/usr/lib), включая текущий каталог (так как вы указали его с -L). Обратите внимание, что это может связываться с общей или статической библиотекой, если это называется libST.a или libST.so.

Если libST не существует в текущей папке, ваш компоновщик будет искать во всех других папках, о которых он знал.

g++ main.cpp libST.a 

Это делает то же самое, но вы явно предоставляете статическую библиотеку для ссылки. Это не будет искать, и оно не будет связываться с общей библиотекой, оно просто вытаскивает объектные файлы из архива и использует их при связывании.

+0

1. В обоих случаях содержимое библиотеки будет скопировано в окончательный исполняемый файл? 2. Действительно, разница в том, что в 1-й команде он также будет искать файл * .so, а во 2-й команде я даю компоновщику прямо что-то, с чем можно работать, без необходимости искать что-то дополнительное? Thank You – Oleg

+0

@Oleg - это действительно зависит. Вы можете настроить компилятор только на использование битов, которые используются, но да, в обоих случаях (с учетом вашей конкретной первой команды), библиотека будет втянута. Кроме того, для (2), да, разница просто как компилятор будет искать библиотеку. – slugonamission

+0

, чтобы вытащить только биты, которые используются ... звучит для меня новичок, не могли бы вы дать мне ключевое слово для поиска? – Oleg

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