2013-11-18 2 views
4

Я использовал zlib целую вечность и никогда не думал о том, что его называют немного нетрадиционно. Хотя большинство библиотек в Linux следуют соглашению об именах lib<name>.so для общих объектов и lib<name>.a для архивов, zlib имеет имя zlib.so/zlib.a. Мой вопрос: как gcc/ld знает, что нужно искать zlib.so, когда я использую -lz в качестве флага ссылки?Как gcc/ld найти zlib.so?

Я понимаю, что для связывания, НКУ вызывает Л.Д., который ищет библиотеки в определенных путях по умолчанию и любому пути, указанный с -L, и это добавляет lib и .so или .a. частей по мере необходимости. Как ни странно, gcc's manual page for linking options только упоминает, что компоновщик может найти архивы; не упоминается расширение .so. Код , по крайней мере, упоминает оба расширения, но по-прежнему упоминает поиск путем добавления lib к указанному имени библиотеки. Как ld знать, чтобы добавить libпослеz для zlib? Я никогда не видел, чтобы это случилось с другой библиотекой.

+2

Это не так. Он ищет 'libz.so', который обычно находится в'/lib' или '/ lib64', но может быть в некоторых дистрибутивах на самом деле находится в'/usr/lib [64] '... Если у вас есть' zlib. поэтому ', которые используют приложения, приложения вызывают' dlopen() ', поэтому связь не выполняется с помощью' ld' (или 'ld.so'). – twalberg

+0

@twalberg, должен ли это быть ответом, а не просто комментарием? Возможно, вы ударили ноготь по голове. Однако, когда я использовал zlib для создания функций Matlab mex, мне пришлось использовать '-lzlib' и предоставить путь' -L' к 'zlib.so'. – patrickvacek

ответ

4

gcc имеет несколько различных методов для связывания библиотек, общих или статических. Если вы укажете -lz, gcc собирается искать libz.so (возможно, с некоторыми версии битов между libz и .so, но важная часть имени файла будет начинаться с libz и заканчиваться .so), или для libz.a (опять же, возможно, с информацией о версии), если вы компилируете статически или как резерв, если разделяемая библиотека не существует. Если вы укажете -lzlib, он будет искать libzlib.so (что не является стандартным именем - пакет часто называют zlib, но сама библиотека libz). Другим способом связывания было бы не использовать опцию -l<lib> и просто указать /path/to/zlib.so или -L /path/to zlib.so (или zlib.a, если хотите). В этом случае библиотека не должна иметь префикс lib, но вам нужно будет явно предоставлять любую информацию о версии, если не будут сделаны положения для символической ссылки или чего-то подобного, чтобы предоставить буквальное имя zlib.so.

Приложения также могут загружать совместно используемые библиотеки во время выполнения через dlopen(), а также другие связанные функции, и в этом случае библиотека также может быть названа так, как вы хотите, (конечно, это не работает для статических библиотек).

Итак, если библиотека вы смотрите на самом деле называется zlib.so, то он не найден gcc ... -lz, если это только не случается быть символической ссылкой на libz.so (или наоборот, в этом случае gcc действительно просто используя libz.so, который имеет тот же контент, что и ваш zlib.so). Однако gcc может использовать его, если процесс сборки явно называет библиотеку в стадии ссылки (не используя -l<lib>), или если ваше приложение загружает ее через dlopen() (но в этом случае она не связана с вашей программой - она ​​просто загружается при запуске время).

+0

Ничего себе, не могу поверить, что раньше я не замечал вариант 'libz.so'.Вы правы во всем этом. И получается, что Matlab достаточно умен, чтобы найти 'zlib.so', если вы используете' -zlib', потому что он ищет библиотеку как с добавленной «lib», так и без нее. – patrickvacek

+0

К сожалению, предыдущий комментарий должен был сказать * если вы используете '-lzlib' *. Это имеет значение! – patrickvacek

Смежные вопросы