Вопросы о том, как библиотеки работают в C
Я новичок в изучении C и хочу использовать библиотечные функции gLib для проекта: http://www.linuxfromscratch.org/blfs/view/svn/general/glib2.html(я использую Ubuntu)
У меня есть пара вопросов о том, как библиотеки работают в C и что происходит, когда вы устанавливаете один или хотите использовать один:
Когда я это устанавливаю (запускаю./configure && make && make install внутри папки), что именно он делает? Из того, что я узнал, есть общие библиотеки в C и статические библиотеки в C. Правда ли, что он устанавливает библиотеку и включает файлы в / usr / lib / или где-то еще?
При использовании gcc с внешними библиотеками вы должны указать флаги -L и -I, чтобы указать, где искать библиотеки и файлы заголовков. Нужно ли указывать эти флаги при установке glib?
Если я захочу упаковать свой исполняемый файл для другой машины, что произойдет, если на другой машине не будет 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. Я постараюсь ответить на ваши вопросы как можно лучше.
При установке библиотеки через исходный пакет да, она устанавливает файлы в различные папки / usr / share / usr / lib / usr / include и т. Д. Настоятельно рекомендуется использовать менеджер пакетов вашего дистрибутива для установки библиотечных пакетов и заголовков разработки. При установке из исходного кода всегда возникает ошибка, так как могут потребоваться необходимые зависимости.
Здесь пригодятся такие инструменты, как 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
- Я думаю, что это хорошая забота о мобильности. Ни одна статическая библиотека не будет кроссплатформенной. Он должен быть скомпилирован для этих платформ вручную. Я рассчитываю избавиться от головной боли, которую вы бы использовали в Anjuta IDE, разработанной программным обеспечением GNOME. Это облегчает разработку приложений GLIB & GTK+, поддерживающих как C, так и C++. Это создаст
Makefile
,configure
и другие файлы, облегчающие разработку кода на кроссплатформенных платформах и упрощающие развертывание. Я мог бы связать вас с некоторыми ресурсами, но моя репутация по переполнению стека меньше 10. Поэтому я просто упомяну название некоторых ресурсов ниже.
Дальнейшее чтение
Учебник по Makefile
Anjuta IDE (C / C++)):: //anjuta.org/
GTK+-3.0 Hello World с компиляцией и компоновкой с использованием pkg-config:
относительно
configure
,make
а такжеmake install
,configure
скрипт оболочки, который используется для обнаружения (и настройки) вашей среды разработкиmake
а такжеmake install
удобный способ создания вашего программного обеспечения. кудаmake
обычно включает компиляцию и компоновку, в то время как make install обычно включает копирование исполняемых файлов и библиотек по стандартному пути и настройку (также включайте файлы, если они обычно находятся в/usr/include
), так что вам не нужно явно указывать путь перед запуском исполняемого файла. Какиеmake
Это можно сделать вручную, но это очень громоздко.Для glibc - да, вы должны указать эти флаги. Обычно на большинстве платформ все библиотеки выпускаются в двух вариантах. Бинарная форма используется для динамического связывания, когда программы действительно загружены. Также - большинство дистрибутивов будут иметь
-dev
или же-devel
версии этих библиотек. Они необходимы для создания программного обеспечения, которое использует эти библиотеки (configure
выше может помочь выяснить, установлены ли библиотеки devel). Обычно, когда вы видите установленную библиотеку, но не ее разработку - вы, скорее всего, увидитеconfigure
ошибки. Короче вам требуетсяdevel
версии, если вы хотите связать с этими библиотеками. Этот шаг не требуется, если вы создаете библиотеки также из исходного кодаmake and make install
,Если вы хотите упаковать свой исполняемый файл для другой машины, и вы не уверены, что другой
glib
там или вы хотите быть уверены, чтоglib
Чтобы быть установленной, должна быть одна конкретная версия, которую вы хотите, вы должны статически связывать при сборке (компиляции / компоновке) библиотеки. эта страница руководства gcc содержит несколько деталей о параметрах ссылок. Я считаю, что должен быть способ статически связать glib (или glib2). Хотя обычно это может не потребоваться, если у вас достаточно приложений, которые уже используют его.