Все ли функции из библиотеки stati c связаны с конечным исполняемым файлом? - PullRequest
0 голосов
/ 26 марта 2020

Я новичок в stati c библиотеках и хочу на 100% быть уверенным, что то, что я делаю, правильно. Если коротко, я попытаюсь объяснить свой вопрос на следующем простом примере:

Если в mylib.a я определил следующие функции:

int f1 (int a, int b) {/*some code here...*/}
int f2 (int a, int b) {/*some code here...*/}
int f3 (int a, int b) {/*some code here...*/}
// we also suppose that f1 does not call f2 or f3.

В моем проекте я связал mylib.a но используется только f1. f2 и f3 тоже попадут в финальный исполняемый файл?

У меня такое ощущение, что это также спецификация компилятора c, но давайте рассмотрим, что мы говорим только о GCC здесь. Я найду любую конкретную c информацию о других компиляторах, таких как MSVC compiler, и о том, как они ценят эту проблему, поскольку я хочу сделать свои библиотеки максимально совместимыми.


Я также нахожу объяснение дано в Википедии расплывчато, так как я не нахожу это ясным ВОЗ включает those parts of the library.... Кроме того, выражение it is enough to include не дает мне уверенности, что включен только и только необходимый код.

При связывании stati c достаточно включить те части библиотеки, на которые прямо или косвенно ссылается целевой исполняемый файл (или целевая библиотека). С динамическими библиотеками c загружается вся библиотека, так как заранее неизвестно, какие функции будут вызываться приложениями.

1 Ответ

4 голосов
/ 26 марта 2020

Традиционно, когда вы связываетесь с библиотекой stati c, каждый объектный файл в библиотеке, который удовлетворяет текущей неудовлетворенной ссылке, будет включен в исполняемый файл. Любые ссылки из выбранных объектных файлов в библиотеке также будут отбираться, повторяя, пока не останется больше объектных файлов, которые могут удовлетворить любые неудовлетворенные ссылки. Затем процесс связывания переходит к следующей библиотеке в списке.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...