Вопросы о том, как библиотеки работают в C

Я новичок в изучении C и хочу использовать библиотечные функции gLib для проекта: http://www.linuxfromscratch.org/blfs/view/svn/general/glib2.html(я использую Ubuntu)

У меня есть пара вопросов о том, как библиотеки работают в C и что происходит, когда вы устанавливаете один или хотите использовать один:

  1. Когда я это устанавливаю (запускаю./configure && make && make install внутри папки), что именно он делает? Из того, что я узнал, есть общие библиотеки в C и статические библиотеки в C. Правда ли, что он устанавливает библиотеку и включает файлы в / usr / lib / или где-то еще?

  2. При использовании gcc с внешними библиотеками вы должны указать флаги -L и -I, чтобы указать, где искать библиотеки и файлы заголовков. Нужно ли указывать эти флаги при установке glib?

  3. Если я захочу упаковать свой исполняемый файл для другой машины, что произойдет, если на другой машине не будет glib? Я думаю, что если бы у меня были статические библиотеки, я мог бы включить их в двоичный файл, но как бы он работал для glib?

3 ответа

Решение

Когда я это устанавливаю (запускаю./configure && make && make install внутри папки), что именно он делает? Из того, что я узнал, есть общие библиотеки в C и статические библиотеки в C. Правда ли, что он устанавливает библиотеку и включает файлы в / usr / lib / или где-то еще?

Ну, это работает в первую очередь ./configure а затем, если это удастся, он работает make и если это удастся, он работает make install, configure это скрипт, который решает множество проблем совместимости между системами. Обычно это сценарии оболочки, так как это общий знаменатель для всех систем, поэтому сценарий конфигурации будет работать в разных системах. Одна вещь configure делает это создать Makefile. Вторая команда make будет использовать только что созданный Makefile для сборки библиотеки или исполняемого файла. Поскольку вы не указали цель (как вы будете в make install) make создаст цель по умолчанию, которая обычно all цель. Это просто условно. Makefiles - это, по сути, список объектов для сборки (цели), а также того, от чего они зависят (зависимости) и как создавать цели (правила). В заключение, make install фактически установит необходимые компоненты. Для библиотек это библиотека и необходимые заголовочные файлы для исполняемых файлов это просто программа. man-страницы также могут быть установлены. Где вы устанавливаете библиотеки, зависит от того, где вы указываете их устанавливать. типично configure возьму --prefix аргумент, который позволяет вам контролировать, где они установлены. Если вы не используете --prefix вы, скорее всего, будете устанавливать в папку по умолчанию для вашей системы.

При использовании gcc с внешними библиотеками вы должны указать флаги -L и -I, чтобы указать, где искать библиотеки и файлы заголовков. Нужно ли указывать эти флаги при установке glib?

Ваш вопрос немного неясен, поэтому позвольте мне сначала убедиться, что я понимаю. Вы спрашиваете, нужно ли после установки glib использовать -L и -I, чтобы указать gcc, где их искать? Если так, то это зависит от того, где вы их устанавливаете. Обычно, когда вы создаете и устанавливаете библиотеку, вы устанавливаете библиотеку и заголовочные файлы в папку по умолчанию или нет. Если вы сделали то, что ваш gcc настроен правильно, то нет, вы не будете. Если вы этого не сделали, то вам, скорее всего, придется использовать -L а также -I

Если я захочу упаковать свой исполняемый файл для другой машины, что произойдет, если на другой машине не будет glib? Я думаю, что если бы у меня были статические библиотеки, я мог бы включить их в двоичный файл, но как бы он работал для glib?

Если у него нет glib, и вы используете общие библиотеки, ваше приложение не будет работать. Вам потребуется либо иметь библиотеки glib той же версии на другом компьютере, либо создавать библиотеки статически. Как их строить статистически зависит от библиотеки. Этот ТАК вопрос может помочь.

Я знаком с разработкой с GTK+ и GLIB. Как я знаю, файлы библиотеки находятся в / usr / lib, а файлы включения находятся в / usr / include. Некоторые библиотеки могут находиться в таких местах, как / usr / local / lib. Я постараюсь ответить на ваши вопросы как можно лучше.

  1. При установке библиотеки через исходный пакет да, она устанавливает файлы в различные папки / usr / share / usr / lib / usr / include и т. Д. Настоятельно рекомендуется использовать менеджер пакетов вашего дистрибутива для установки библиотечных пакетов и заголовков разработки. При установке из исходного кода всегда возникает ошибка, так как могут потребоваться необходимые зависимости.

  2. Здесь пригодятся такие инструменты, как autogen и makefiles. Вам не обязательно заботиться о том, чтобы уточнить все это. инструменты, такие как pkg-config справиться со всей этой работой. Большинство библиотек устанавливают файл конфигурации пакета в каталоги /usr/lib/pkgconfig & /usr/share/pkgconfig. Это помогает любому, кто разрабатывает приложение, легко связать свой код с библиотеками.

Использование пакета config для получения конфигурации:

 $ pkg-config --cflags --libs glib-2.0
-I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include  -lglib-2.0

Связывание с использованием GCC и конфигурации пакета:

$gcc example.c `pkg-config --cflags --libs gtk+2.0 glib-2.0` -o example

Приведенная выше команда свяжет мою программу с gtk & glib.

Использование Makefile, чтобы больше никогда не вводить эти длинные строки:

Makefile:

OBJS = main.o callbacks.o
CFLAGS = `pkg-config --cflags --libs  gtk+-2.0`
program:  $(OBJS)
    gcc -o program $(OBJS)
main.o: main.c
    gcc -c main.c $(FLAGS)
callbacks.o: callbacks.c callbacks.h
    gcc -c callbacks.c $(FLAGS)

.PHONY : clean
clean:
    rm *.o
    rm program
.PHONY : install
install:
    cp program /usr/bin
.PHONY : uninstall
uninstall:
    rm /usr/bin/program

Приведенный выше make-файл предназначен для простого приложения GTK+2.0, так как вы можете определить, какой пакет конфигурации входит в CFLAGS чтобы сделать программу исполняемой, все, что вам нужно ввести в исходный каталог, будет make, pkg-config будет работать только в том случае, если вы установили пакеты разработки для библиотеки, с которой пытаетесь работать. Чтобы Ubuntu установил файлы разработки GTK+-3.0 и GLIB, вы должны ввести:

$ apt-get install libgtk-3-dev
  1. Я думаю, что это хорошая забота о мобильности. Ни одна статическая библиотека не будет кроссплатформенной. Он должен быть скомпилирован для этих платформ вручную. Я рассчитываю избавиться от головной боли, которую вы бы использовали в Anjuta IDE, разработанной программным обеспечением GNOME. Это облегчает разработку приложений GLIB & GTK+, поддерживающих как C, так и C++. Это создаст Makefile, configure и другие файлы, облегчающие разработку кода на кроссплатформенных платформах и упрощающие развертывание. Я мог бы связать вас с некоторыми ресурсами, но моя репутация по переполнению стека меньше 10. Поэтому я просто упомяну название некоторых ресурсов ниже.

Дальнейшее чтение

Учебник по Makefile

Anjuta IDE (C / C++)):: //anjuta.org/

GTK+-3.0 Hello World с компиляцией и компоновкой с использованием pkg-config:

  1. относительно configure, make а также make install, configure скрипт оболочки, который используется для обнаружения (и настройки) вашей среды разработки make а также make install удобный способ создания вашего программного обеспечения. куда make обычно включает компиляцию и компоновку, в то время как make install обычно включает копирование исполняемых файлов и библиотек по стандартному пути и настройку (также включайте файлы, если они обычно находятся в /usr/include), так что вам не нужно явно указывать путь перед запуском исполняемого файла. Какие make Это можно сделать вручную, но это очень громоздко.

  2. Для glibc - да, вы должны указать эти флаги. Обычно на большинстве платформ все библиотеки выпускаются в двух вариантах. Бинарная форма используется для динамического связывания, когда программы действительно загружены. Также - большинство дистрибутивов будут иметь -dev или же -devel версии этих библиотек. Они необходимы для создания программного обеспечения, которое использует эти библиотеки (configure выше может помочь выяснить, установлены ли библиотеки devel). Обычно, когда вы видите установленную библиотеку, но не ее разработку - вы, скорее всего, увидите configure ошибки. Короче вам требуется devel версии, если вы хотите связать с этими библиотеками. Этот шаг не требуется, если вы создаете библиотеки также из исходного кода make and make install,

  3. Если вы хотите упаковать свой исполняемый файл для другой машины, и вы не уверены, что другой glib там или вы хотите быть уверены, что glib Чтобы быть установленной, должна быть одна конкретная версия, которую вы хотите, вы должны статически связывать при сборке (компиляции / компоновке) библиотеки. эта страница руководства gcc содержит несколько деталей о параметрах ссылок. Я считаю, что должен быть способ статически связать glib (или glib2). Хотя обычно это может не потребоваться, если у вас достаточно приложений, которые уже используют его.

Другие вопросы по тегам