Как говорит Игнасио, файлы .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» в начале имени.