2016-03-16 3 views
0

Я начинаю программировать в Rust, и одна из первых вещей, которые я заметил, это то, что Rust производит большие двоичные файлы. Например, «Hello world!» Руста! двоичный размер ~ 600K, а эквивалентный C-бит - ~ 8K.Являются ли библиотеки в C статически связанными?

После некоторых поисков я нашел this SO сообщение, объясняющее, что двоичные файлы Rust являются большими, потому что все необходимые библиотеки статически связаны. Но разве дело не в C? Когда я пишу #include <stdio.h> в C, не ставьте ли я статически ссылку на соответствующие библиотеки ввода-вывода? Я всегда предполагал, что ответ «да», но теперь я сомневаюсь в себе.

+0

Нет, не всегда. Обычно '-l' идет для динамической компоновки' .so' файлов. –

+1

Ссылка отличается от включения файла заголовка. ('#include ' не является ссылкой/инструкцией связывания.) – callyalater

+0

Нет, статические или динамические ссылки - это варианты, которые вы выбираете. –

ответ

3

#include копирует содержимое файла в исходный файл, но если заголовок не более чем декларациями функций, все, что бы сделать, это сказать программе, что эти функции доступны называться в вашем коде. Фактическая реализация может быть определена в другом файле, который необходимо связать (статически или динамически) с вашим исполняемым файлом. Если вы посмотрите на заголовок для stdio.h, вы увидите, что он содержит только прототипы функций.

Многие компиляторы предоставляют параметры для статической или динамической компоновки для стандартных библиотек.

+0

Спасибо. Заключительный вопрос: у меня есть проект, который использует некоторые библиотеки Boost. Есть ли способ узнать, были ли эти библиотеки статически или динамически связаны? –

+1

@AlessandroPower: Если вы используете Unix-подобную систему, запустите 'ldd' в исполняемом файле. –

+0

@AlessandroPower 'boost' - это только библиотека заголовка (ожидайте некоторые конкретные части). Таким образом, не требуется привязка для большей части повышения. – Garf365

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