Зачем нужны static libraries?

bleyman

если есть object files? То есть, если мне влом делать статическую библиотеку из одного исходника, и я вместо этого прям объектный файл линкую, я не наступлю на какие-нибудь ужасные грабли между делом? Интересует в контексте как винды, так и луниксов.

procenkotanya

В линуксе то, что получается из одного исходника, и так распространяется как объектный файл, всякие crt*.o. Смысл .a в том, что она распространяется как один файл, а при линковке из неё копируются только нужные объектники (см. также -ffunction-sections, -fdata-sections).

Marinavo_0507

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

amkharchenko

Конкретно в луниксах, если верить man-pages ( http://linux.die.net/man/1/ar http://linux.die.net/man/1/ar, http://www.freebsd.org/cgi/man.cgi?ar ) сборка в архив позволяет ускорить процесс линковки благодаря сборке символов из объектников в единую таблицу в архиве.

shlyumper

Тупо удобство. Чтобы не думать, какие объектные файлы линковать надо. Если ты линкуешь файлы напрямую - они линкуются всегда, хоть используешь ты код из них, хоть нет. Если через статическую библиотеку - автоматом линкуются только те объектные файлы, из которых используется код.
На досе/винде, насколько помню, микрософтовскии линкеры чреез библиотеки умели еще и объектные файлы на куски дербанить: типа если у тебя в одном объектом файле сидит две функции, а прога использует только одну, то при линковке через библиотеку не весь код попадает в результат.

Maurog

Если ты линкуешь файлы напрямую - они линкуются всегда, хоть используешь ты код из них, хоть нет.
насколько мне известно, они линкуются по тем же правилам, что и подобъектники в статических библиотеках (подразумевается дефолтное поведение дефолтных компиляторов VS + gcc): то бишь не линкуются, если из них ничего не используется

shlyumper

Нифига. Это ж проверяется элементарно:

$ cat foo.c
void foo { static char *x = "hello"; }
$ cat bar.c
void bar { static char* x = "world"; }
$ cat a.c
extern foo; extern bar;
int main(void) { foo; }
$ gcc -c *.c
$ gcc a.o foo.o bar.o
$ strings a.out | egrep 'hello|world'
hello
world
$ ar r libxxx.a foo.o bar.o
ar: creating libxxx.a
$ gcc a.o libxxx.a
$ strings a.out | egrep 'hello|world'
hello
Оставить комментарий
Имя или ник:
Комментарий: