Имена библиотек gcc

329
12 августа 2017, 03:49

Из литературы по С++ известны наименования библиотек (например, math). В линуксовском компиляторе gcc (а возможно и в g++) эта библиотека называется libm. Исходя из этого, параметром терминальной команды (создающей запускаемый файл) нужно указать –lm (получается из libm заменой lib на l). Вопрос: из чего следует, что библиотека math в gcc именуется libm?

Answer 1
  1. Из исходных кодов
  2. Из документаций
  3. Из простейшей логики: libm = library math

Если ее писал не ты, то не нужно искать причин почему библиотека названа так, как она названа.

Answer 2

Параметры командной строки -l заставляют компилятор искать библиотеку с заданным именем. То, что идёт после буквы l является именем (первый пробел игнорируется). Поиск производится следующий образом:

  1. Рассматривается каждый из каталогов поиска библиотек по порядку. Дополнительные каталоги можно указать параметром -L аналогично имени библиотеки. По умолчанию этот список содержит такие каталоги:

    • /usr/lib/gcc/x86_64-linux-gnu/5 (может быть иная архитектура или версия GCC)
    • /lib/x86_64-linux-gnu (архитектура может отличаться)
    • /usr/lib/x86_64-linux-gnu (архитектура может отличаться)
    • /lib
    • /usr/lib
  2. Если хотя бы в одном из каталогов поиска будет найден файл с именем libбиблиотека.so или libбиблиотека.a, поиск останавливается и выбирается файл, содержащий определения нужных функций (и иных символов).

  3. Если в каталоге несколько файлов подходят под шаблоны выше, то без указания опции --static, выбор происходит по вышеуказанному порядку. Если заказана статическая компоновка, приоритеты меняются наоборот. По умолчанию выполняется динамическая компоновка, т.е. предполагается параметр --shared.

Примечание: названия библиотек рекомендуется перечислять после всех исходных файлов.

Что делать, если имя файла с библиотекой не начинается с букв lib? Просто укажите к нему путь относительно текущего каталога.

Примеры:

Компиляция программы, использующей стандартную математическую библиотеку.

gcc my_prog.c -lm

Или что то же самое

gcc my_prog.c /usr/lib/x86_64-linux-gnu/libm.so  # путь может отличаться

Впрочем, на некоторых системах можно обойтись без явного указания библиотеки m.

Компиляция программы, написанной на фреймворке Qt, причём сама Qt установлена владельцем системы вручную

gcc my_prog.c -L/usr/local/lib/qt5 -lQt5Core

В качестве эксперимента, посмотрите, какие библиотеки вам доступны командой

ls /usr/lib/*.so /usr/lib/*/*.so
READ ALSO
Приведение double к float в C++

Приведение double к float в C++

Пусть переменная типа double приводится к переменной типа floatЕсли переменная double хранит значение NaN, то оно преобразуется в NaN

379
libVLC Нужно ли вручную загружать библиотеки?

libVLC Нужно ли вручную загружать библиотеки?

Использую VLC SDK со статическими библиотеками, подгружаю вручную библиотеки libvlcdll, libvlccore

304
Использование Desktop Duplication API

Использование Desktop Duplication API

Привожу пример своего исходника по работе с Desktop Duplication API (на C++/CLI)К сожалению, не могу добиться от него результата - картинка получается пустая

498
Отправка Post запроса на Random.org

Отправка Post запроса на Random.org

Нужна помощь с Randomorg API

416