Как вы на самом деле используете библиотеку C? - PullRequest
6 голосов
/ 17 ноября 2009

Я уверен, что этот вопрос задавался много раз, но я не могу понять это. Потерпи меня.

Итак, когда вы загружаете библиотеку, вы получаете кучу файлов .c и .h, а также много других вещей. Теперь скажите, что вы хотите написать программу с использованием этой библиотеки.

Я копирую все файлы .h в каталог моего проекта. Он просто не компилируется.

Отлично, тогда я получаю библиотеку в виде набора .dll и копирую dll в каталог моего проекта. Все еще не компилируется.

Как это работает?

Что вы делаете, например, сразу после создания папки для вашего проекта? Какие части пакета библиотеки вы копируете / вставляете в папку? Как сделать так, чтобы он мог компилироваться? Пройдите со мной, пожалуйста, по шагам.

  1. Где поместить файлы .h?
  2. Где разместить файлы .dll?
  3. Как скомпилировать?

Спасибо.

(библиотека, которую я пытаюсь заставить работать, это libpng, я нахожусь в Windows с MinGW, и я собираюсь скомпилировать из командной строки, как обычно.)

(из того, что я собираю, вы помещаете файлы .h в каталог A, а файлы .dll - в каталог B, и вы можете использовать опции компилятора -l и -L, чтобы сообщить компилятору, где их искать, это правильно? )

Ответы [ 7 ]

12 голосов
/ 17 ноября 2009

Вот краткое руководство о том, что происходит, когда вы компилируете и создаете базовый проект C:

  • На первом этапе компилируются все ваши исходные файлы - он берет записанные вами исходные файлы и переводит их в так называемые объектные файлы . На этом этапе компилятору необходимо знать объявление всех функций, которые вы используете в своем коде, даже во внешних библиотеках, поэтому вам нужно использовать #include для включения заголовочных файлов любых библиотек, которые вы используете. Это также означает, что вам нужно указать компилятору местоположение этих заголовочных файлов. С GCC вы можете использовать командную строку -I для подачи в каталоги, в которых нужно искать заголовочные файлы .

  • Следующий этап - объединение всех объектных файлов в один исполняемый файл. На этом этапе компоновщик должен разрешать вызовы во внешние библиотеки. Это означает, что вам нужна библиотека в форме объекта. Большинство библиотек дадут вам инструкции о том, как ее сгенерировать, или могут предоставить ее в готовом виде. В Linux файл библиотеки часто представляет собой файл .a или .so, хотя это может быть просто .o. Опять же, вы можете указать местоположение объектного файла библиотеки в GCC с опцией -L.

Таким образом, ваша командная строка будет выглядеть так:

gcc myProg.c -I/path/to/libpng/include -L/path/to/libpng/lib -lpng -o myProg.exe

(Обратите внимание, что при использовании командной строки -l GCC автоматически добавляет lib в начало библиотеки, поэтому -lpng вызывает связывание libpng.a.)

Надеюсь, это поможет.

7 голосов
/ 17 ноября 2009

Делаем это под окнами (предположим, вы пользователь Visual Studio)

  • После распаковки добавьте библиотеку, включающую каталоги в настройки ваших проектов (Проект -> Свойства -> C / C ++ -> Дополнительные включаемые каталоги)

  • Сделайте то же самое для каталога библиотек (проект -> свойства -> компоновщик -> дополнительные каталоги библиотек)

  • Укажите имя библиотеки во входных данных компоновщика: Project -> Properties -> Linker -> Input -> Дополнительные зависимости

После этого, надеюсь, следует скомпилировать.

Я не рекомендую добавлять указанные выше каталоги к глобальным настройкам в Visual Studio (Инструменты -> Параметры -> Проект и решения), поскольку это создаст среду, в которой что-то компилируется на вашем компьютере, а НЕ компилируется на другом.

Теперь трудный путь для системы сборки на основе Makefile:

  • Распакуйте вещи
  • Укажите каталог включения под флагом -I g ++
  • Укажите каталог библиотеки под флагом -L g ++
  • Укажите библиотеки для использования, например: -llibrary name (например: -lxml2 для libxml2.so)
  • Укажите статические библиотеки, например: имя библиотеки.a

в конце вы должны иметь некрасивую команду:

g ++ -I / work / my_library / include -L / work / my_library / lib -lmylib my_static.a -o appname_exe MYFILE.CPP

(приведенная выше строка на самом деле не проверена, просто общая идея)

Я рекомендую пойти, взять откуда-нибудь шаблонный файл и добавить все свои вещи.

3 голосов
/ 17 ноября 2009

Вы должны ссылаться на .lib или что-то подобное, то есть добавить ".lib" в библиотеки, прочитанные компоновщиком. По крайней мере, так работает в Linux ... Windows так долго не делал.

. ".Lib" содержит символы для данных / функций в общей библиотеке .dll.

2 голосов
/ 17 ноября 2009

Это зависит от библиотеки. Например, некоторые библиотеки содержат предварительно скомпилированные двоичные файлы (например, dll), а другие вам необходимо скомпилировать самостоятельно. Вам лучше посмотреть документацию библиотеки.

В основном, для компиляции вы должны:

(1) имеет расположение файла включения (.h) библиотеки в пути включения компилятора,

(2) иметь расположение библиотечных заглушек (.lib) в пути к библиотеке компоновщика и ссылаться на соответствующий файл библиотеки.

Чтобы запустить программу, вам нужны общие библиотеки (dll), где их может видеть загрузчик, например, в каталоге system32.

1 голос
/ 17 ноября 2009

Существует два вида библиотек: статические и динамические (или совместно используемые).

Статические библиотеки поставляются в объектном формате, и вы связываете их непосредственно с вашим приложением.

Общие или динамические библиотеки находятся в отдельном файле (.dll или .so), который должен присутствовать во время запуска приложения. Они также поставляются с объектными файлами, которые вы должны связать с вашим приложением, но в этом случае они не содержат ничего, кроме заглушек, которые находят и вызывают двоичный файл среды выполнения (.dll или .so).

В любом случае у вас должны быть некоторые заголовочные файлы, содержащие подписи (объявления) библиотечных функций, иначе ваш код не будет компилироваться.

Некоторые «библиотеки» предназначены только для заголовков, и вам ничего не нужно делать, кроме как включать их. Некоторые состоят из заголовочных и исходных файлов. В этом случае вы должны скомпилировать и связать исходные тексты с вашим приложением так же, как и с исходным файлом, который вы написали.

1 голос
/ 17 ноября 2009

Когда вы компилируете, предполагая, что у вас есть библиотеки и заголовки в той же папке, что и исходные тексты, которые вы компилируете, вам нужно добавить в строку компиляции -L . -I . -lpng. -L сообщает компоновщику, где искать библиотеку, -Я сообщает компилятору, где искать заголовки, а -lpng указывает компоновщику связываться с библиотекой png.

[Изменить] Обычные проекты имеют некоторую иерархию, где заголовки находятся в папке /include, а сторонние библиотеки находятся в папке /libs. В этом случае вы бы поставили -I ./include и -L ./libs вместо -I . и -L.

[Edit2] Большинство проектов используют make-файл для компиляции из командной строки. Вы можете скомпилировать вручную только для небольшого количества файлов, после этого он становится довольно беспокойным

0 голосов
/ 17 ноября 2009

Кроме того,
Вы можете просмотреть поддержку Dynamic Loading на разных языках и на разных платформы.
Эта поддержка очень удобна в тех случаях, когда вы хотите использовать библиотеку по желанию и не хотите, чтобы ваша программа не работала в случае недоступности библиотеки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...