Подтвердить что ты не робот

Как использовать библиотеки

По какой-то причине я никогда не могу использовать внешние библиотеки на любом языке. Я ищу инструкции/объяснения, как использовать внешние библиотеки, а также как они работают. Когда я ищу в Интернете, я получаю фрагменты, которые никогда, похоже, не применяются к какой-либо библиотеке, которую я скачиваю и пытаюсь использовать. Я работаю как с Mac, так и с ПК, а примеры на С++ прекрасны. Я использую eclipse IDE с подключаемым модулем С++. Если есть инструкции, которые применяются ко всем библиотекам, это было бы здорово.

4b9b3361

Ответ 1

Скажите, что у вас есть класс Unuseful, который определяется следующим образом:

Файл Unuseful.h:

class Unuseful {
public:
    void printUnusefulStatement();
};

Файл Unuseful.cpp:

#include "unuseful.h"
#include <iostream>

void Unuseful::printUnusefulStatement()
{
    std::cout << "Hello world!" << std::endl;
}

Теперь у вас есть еще один класс, который нуждается в печати неиспользуемых операторов:

Unuseful u;
u.printUnusefulStatement();

Это означает, что вы хотите использовать внешнюю библиотеку, содержащую конкретную реализацию (printUnusefulStatement), которую вы хотите включить в свой код.

Вы можете использовать эту библиотеку двумя способами:

  • Предоставляя исходный код компилятору
  • Предоставив двоичный файл (который ранее был скомпилирован для вашей архитектуры), в компоновщик

Случай 1: использование библиотеки во время компиляции

Это простейший случай. У вас есть исходный код библиотеки, которую вы должны использовать, и вам просто нужно скомпилировать ее вместе с существующим кодом (скажем, main.cpp file). Обычно вы являетесь автором и пользователем библиотеки (класс, который выполняет требуемую задачу).

Компиляция с помощью этой команды:

g++ main.cpp unuseful.cpp

позволяет использовать нужную реализацию в вашем файле main.cpp.

Случай 2: связывание библиотеки

Чаще, чем в случае 1, у вас нет исходного кода библиотеки, которую вы хотите использовать. У вас есть только заголовочный файл (Unuseful.h, чтобы продолжить этот пример) и статическая или общая библиотека (возможно, [*] libunuseful.a и libunuseful.so файлы, соответственно).

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

Статические библиотеки создаются путем простого архивирования файлов *.o с помощью программы ar:

# Create the object files (only one here)
g++ -c unuseful.cpp
# Create the archive (insert the lib prefix)
ar rcs libunuseful.a unuseful.o

Общие библиотеки создаются с помощью опции g++ -shared:

# Create the object file with Position Independent Code[**]
g++ -fPIC -c unuseful.cpp
# Crate the shared library (insert the lib prefix)
g++ -shared -o libunuseful.so unuseful.o

Предположим теперь, что у вас есть файл Unuseful.h и общая библиотека (libunuseful.so file), и у вас есть файл main.cpp, который создает объект Unuseful и вызывает метод printUnusefulStatement.

Если вы попытаетесь скомпилировать этот файл (g++ main.cpp), компоновщик будет жаловаться, потому что он не может найти символ printUnusefulStatement.

Пришло время использовать библиотеку:

g++ main.cpp -L. -lunuseful

Опция -L указывает компоновщику, где искать файлы библиотеки, а флаг -L указывает компоновщику имя используемых библиотек (без префикса lib).

Теперь создается исполняемый файл (a.out, потому что я не указывал другое имя), и вы использовали библиотеку для реализации необходимой вам функции (printUnusefulStatement).

Поскольку общая библиотека загружается во время выполнения, выполнение исполняемого файла a.out может завершиться неудачно, потому что система не может найти библиотеку. Обычно это можно решить, установив соответствующую переменную среды, указывающую, какие пути использовать для поиска динамических библиотек:

# Set the LD_LIBRARY_PATH [*]
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

Готово, теперь ваш исполняемый файл скомпилирован, и он сможет запускать и загружать нужную библиотеку.

Заключение

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

Есть много аспектов, которые необходимо изучить более подробно, если вам интересно: g++ параметры при создании разделяемых библиотек, ar параметры, переменные среды, формат разделяемых библиотек и т.д.

[*]: в среде Unix

[**]: если поддерживается для целевой машины, испускайте независимый от положения код, подходящий для динамической компоновки и избегая любого ограничения на размер глобальной таблицы смещения. Этот параметр имеет значение для m68k, PowerPC и SPARC. Независимый от позиции код требует специальной поддержки и поэтому работает только на определенных машинах. [Из справочной страницы g++]

Ответ 2

Здесь, где вы начинаете http://en.wikipedia.org/wiki/Library_ (вычисления)

В принципе, "библиотека" представляет собой набор скомпилированных функций и деклараций классов.

На Mac также есть "фреймворки", которые несколько похожи на блоки Pascal и содержат как объявления, так и скомпилированный код.

В управляемых языках, таких как Java или С#, есть пакеты и сборки. Оба они тесно связаны с библиотеками.

Для использования библиотек на C или С++ у вас должен быть .lib файл (или .a файл для большинства компиляторов POSIX или GCC на основе инструментальных средств) и прототипы функций, которые скомпилированы в файл .lib, В зависимости от вашей среды разработки (для Eclipse вы, скорее всего, используете компилятор GCC и инструментальную цепочку GNU с LD linker), вы просто указываете файлы библиотеки (.lib или .a) в качестве входных данных для компоновщика. Большую часть времени библиотека сопровождается заголовочными файлами, содержащими определения прототипов функций.

Даже если вы не знали о компоновщике, что довольно странно, библиотеки по-прежнему используются в вашей программе неявно - std:: cout находится в библиотеке libstdС++ или C.

В качестве примера огромной библиотеки и полезного набора классов С++ вы можете посмотреть Boost.

Чтобы написать графический интерфейс в Windows, вы можете использовать WinAPI, который описан в MSDN.

Чтобы написать графический интерфейс на Mac, вы можете использовать API-интерфейс Carbon, который несколько похож на WinAPI, но теперь устарел. Единственный способ написать "законный" GUI для MacOS - использовать Cocoa и Objective-C.

Для написания кросс-платформенного графического интерфейса вы можете использовать множество библиотек: Qt, wxWidgets, GTK среди них.

Последнее, но не самое меньшее. С++ - не лучший язык для графического интерфейса.