Как компилятор C находит, что -lm указывает на файл libm.a? - PullRequest
6 голосов
/ 11 октября 2010

Что такое .a файлы в программировании на C в Linux?Это файл библиотеки?

To merge with the math library libm.a you would type

 cc -o program_name prog.c -lm

when you compile the program. The -lm means: add in libm. If we wanted to add in the socket library libsocket.a to do some network programming as well, we would type

 cc -o program_name prog.c -lm -lsocket

and so on. 

Вот как компилятор находит, что -lm указывает на файл libm.a, а -lsocket как libsocket.a?

И если мы добавим заголовокфайл в программу, мы должны упомянуть библиотеку при компиляции?

Ответы [ 3 ]

10 голосов
/ 11 октября 2010

Как говорит Игнасио, файлы .a являются статическими библиотеками. «A» означает «архив», а файлы .a создаются программой с именем «ar».

Каждый файл .a содержит один или несколько файлов .o и индекс имен. В процессе компоновки в окончательную программу включаются только файлы .o, которые содержат используемые имена. Это сделано для того, чтобы вместо включения всей библиотеки C копировались только используемые функции, такие как «printf».

Как компилятор находит библиотеки? Он имеет встроенную коллекцию путей поиска библиотек. Например, GCC сообщит вам пути поиска, если их спросят:

# gcc -print-search-dirs
install: /usr/lib/gcc/i686-redhat-linux/4.4.4/
programs: =/usr/libexec/gcc/i686-redhat-linux/4.4.4/:/usr/libexec/gcc/i686-redhat-linux/4.4.4/:/usr/libexec/gcc/i686-redhat-linux/:/usr/lib/gcc/i686-redhat-linux/4.4.4/:/usr/lib/gcc/i686-redhat-linux/:/usr/libexec/gcc/i686-redhat-linux/4.4.4/:/usr/libexec/gcc/i686-redhat-linux/:/usr/lib/gcc/i686-redhat-linux/4.4.4/:/usr/lib/gcc/i686-redhat-linux/:/usr/lib/gcc/i686-redhat-linux/4.4.4/../../../../i686-redhat-linux/bin/i686-redhat-linux/4.4.4/:/usr/lib/gcc/i686-redhat-linux/4.4.4/../../../../i686-redhat-linux/bin/
libraries: =/usr/lib/gcc/i686-redhat-linux/4.4.4/:/usr/lib/gcc/i686-redhat-linux/4.4.4/:/usr/lib/gcc/i686-redhat-linux/4.4.4/../../../../i686-redhat-linux/lib/i686-redhat-linux/4.4.4/:/usr/lib/gcc/i686-redhat-linux/4.4.4/../../../../i686-redhat-linux/lib/:/usr/lib/gcc/i686-redhat-linux/4.4.4/../../../i686-redhat-linux/4.4.4/:/usr/lib/gcc/i686-redhat-linux/4.4.4/../../../:/lib/i686-redhat-linux/4.4.4/:/lib/:/usr/lib/i686-redhat-linux/4.4.4/:/usr/lib/

Вы можете добавить дополнительные пути поиска в библиотеке, используя опцию "-L / path".

В этих путях сначала выполняется поиск «динамических библиотек» с именами с расширением «.so». Затем он ищет статические библиотеки с расширением ".a". Он всегда добавляет «lib» в начале имени.

2 голосов
/ 11 октября 2010
Файлы

.a представляют собой статические библиотеки , в отличие от .so файлов, которые являются динамическими библиотеками. Обычно gcc ищет динамические библиотеки, если они доступны, если не передано -static.

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

1 голос
/ 12 октября 2010

Компилятор "знает", что искать libm.a (или libm.so), когда вы передаете ему параметр -lm, потому что именно так задокументирована и реализована опция -l: взять символы, следующие за -l (здесь просто m), префикс lib и суффикс .a, чтобы получить libm.a

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

...