Страницы

Поиск по вопросам

пятница, 14 февраля 2020 г.

Как заголовочный файл указывает на библиотеку?

#linux #c #make


Начал знакомится с make и задался этим вопросом..
К примеру есть подключённый заголовок: #include
В нём ,как я понимаю лежат прототипы функций, а сами функции откомпилированы в объектные
файлы и собраны в библиотеку к примеру ".a". 
Линковщик увидев строку заголовка, идёт в /usr/lib . 
Но как он видит нужную библиотеку ? Перебирает все ?
    


Ответы

Ответ 1



В традиционной реализации линкер никак не видит нужную библиотеку. Это ваша задача вручную "скормить" линкеру соответствующую библиотеку во время линковки. Однако стандартная библиотека языка С обычно подается на вход линкеру автоматически, без вашего участия, т.е. именно для #include вам обычно ничего дополнительно делать не надо. В некоторых реализациях есть возможность таки указать внутри заголовочного файла, какую именно библиотеку необходимо подключить. Например, в MS Visual Studio это делается путем указания #pragma comment(lib, "something.lib") внутри заголовочного файла. В таком варианте после включения заголовочного файла соответствующая библиотека на этапе линковки подключится "сама". Линковщик увидев строку заголовка, идёт в /usr/lib... Линковщик обычно уже не может видеть никакой "строки заголовка". Эти "строки заголовка" исчезают бесследно еще на этапе препроцессинга, даже еще до начала собственно компиляции. До линковщика уже доходят откомпилированные объектные файлы, в которых никаких "строк заголовка" уже нет. Реализация таких вещей как #pragma comment(lib, держится на специальных полях в формате объектных файлов.

Ответ 2



Когда компилируешь на языке C, то автоматически линкуется одна библиотека. Она подключается вживую при запуске программы. У меня эта библиотека такая : /lib64/libc-2.22.so. Все остальные библиотеки ты должен подключать вручную. Например gcc -lrt ... подключает /lib64/librt-2.22.so для параллельных нитей. Она тоже будет подключатся вживую. То-же самое только через ссылки : /usr/lib64/libc.so и /usr/lib64/librt.so.

Ответ 3



Линковщик увидев строку заголовка, идёт в /usr/lib Разумеется - нет. Как уже отвечали, на этапе линковки никаких операторов #include да и самих файлов заголовков уже нет Но как он видит нужную библиотеку ? Поскольку речь идёт о linux и make, то можно ответить так - из командной строки gcc: Ключ -l (это буква "эль малая") задаёт имя ФАЙЛА используемой Вами библиотеки. Префикс lib и суффикс so можно опустить. Таким образом, если Вы используете математическую библиотеку libm.so, то ключ надо записать так: -lm Ключ -L задаёт ДИРЕКТОРИЮ, в которой лежат Ваши библиотеки. Если они расположены в стандартных каталогах (/lib, /usr/lib, ...) то использовать этот ключ не нужно. Если же Ваши библиотеки лежат в "левых" каталогах, то их надо указать обязательно. Типичная ситуация, когда автор программы желает расположить библиотеки в том же месте, где лежит исполняемый модуль. Тогда надо написать так: -L.

Комментариев нет:

Отправить комментарий