Теперь в случае запуска программы app
/usr/local/lib
.Но есть и другое решение: устанавливать переменную LD_LIBRARY_PATH
PATH
, переменная LD_LIBRARY_PATH
представляет собой разделенный двоеточиями список каталогов. Если, к примеру, она равна /usr/local/lib:/opt/lib
, то каталоги /usr/local/lib
и /opt/lib
будут просматриваться перед стандартными каталогами /lib
и /usr/lib
. Необходимо также учитывать, что при наличии данной переменной компоновщик будет просматривать заданные в ней каталоги, обнаруживая опцию -L
в командной строке.[9]2.3.3. Стандартные библиотеки
Даже если при компоновке программы не были заданы библиотеки, все равно одна из них почти наверняка присутствует. Дело в том, что компилятор gcc
libc
. В нее, однако, не входят математические функции. Они находятся в отдельной библиотеке, libm
, которую нужно компоновать явно. Например, чтобы скомпилировать и скомпоновать программу compute
, использующую тригонометрические функции (такие как sin()
и cos()
), необходимо задать следующую команду:% gcc -о compute compute.c -lm
При компоновке программ, написанных на C++, компилятор c++
g++
автоматически подключает к ним стандартную библиотек языка C++: libstdc++
.2.3.4. Зависимости между библиотеками
Библиотеки часто связаны одна с другой. Например, во многих Linux-системах есть библиотека libtiff
libjpeg
(подпрограммы обработки JPEG-изображений) и libz
(подпрограммы сжатия).В листинге 2.9 показана небольшая программа, использующая функции библиотеки libtiff
libtiff
#include
#include
int main(int argc, char** argv) {
TIFF* tiff;
tiff = TIFFOpen(argv[1], "r");
TIFFClose(tiff);
return 0;
}
При компиляции этого файла необходимо указать флаг -ltiff
% gcc -о tifftest tifftest.c -ltiff
По умолчанию будет скомпонована совместно используемая версия библиотеки: /usr/lib/libtiff.so
libjpeg
и libz
(одна совместно используемая библиотека может ссылаться на другие аналогичные библиотеки, от которых она зависит), будут также подключены их совместно используемые версии. Чтобы проверить это, воспользуемся командой ldd
:% ldd tifftest
libtiff.so.3 => /usr/lib/libtiff.so.3 (0x4001d000)
libc.so.6 => /lib/libc.so.6 (0x40060000)
libjpeg.so.62 => /usr/lib/libjpeg.so.62 (0x40155000)
libz.so.1 => /usr/lib/libz.so.1 (0x40174000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
В противоположность этому статические библиотеки не могут указывать на другие библиотеки. Если попытаться подключить к программе статическую версию библиотеки libtiff
-static
, компоновщик столкнется с нераспознаваемыми символическими константами:% gcc -static -о tifftest tifftest.с -ltiff
/usr/bin/../lib/libtiff.a(tif_jpeg.o): In function
'TIFFjpeg_error_exit':
tif_jpeg.о(.text+0x2a): undefined reference to 'jpeg_abort'
/usr/bin/../lib/libtiff.a (tif_jpeg.o): In function
'TIFFjpeg_create_compress':
tif_jpeg.o(.text+0x8d): undefined reference to 'jpeg_std_error'
tif_jpeg.o(.text+0xcf): undefined reference to
'jpeg_CreateCompress'
...
В случае статической компоновки программы нужно самостоятельно указать две другие библиотеки:
% gcc -static -o tifftest tifftest.c -ltiff -ljpeg -lz