Как подключить статическую библиотеку c

Схема динамического и статического подключения C/C++ библиотеки

Post date: Sep 30, 2011 3:22:11 PM

Создание библиотеки в Visual Studio

Выполнить команду контекстного меню File->New Project

Ввести имя проекта

Нажать на кнопку Create

Нажать на кнопку Next

Выбрать Application Type равным DLL

Установить Additional Options равными Empty Project

Нажать на кнопку Finish

Добавить необходимые заголовочные файлы в папку Header Files. Например, добавим файл header.h, в котором разместим объявления функций.

Добавить необходимые файлы исходных кодов в папку Source Files. Например, добавим файл source.cpp, в котором разместим реализации.

Содержимое заголовочного файла:

extern «C» __declspec(dllexport) int TestFunction(int w, int h);

Содержимое файла исходных кодов:

int TestFunction(int w, int h)

Создание консольного приложения

Выполнить команду контекстного меню File->New Project

Ввести имя проекта

Нажать на кнопку Create

Нажать на кнопку Next

Выбрать Application Type равным Console Application

Установить Additional Options равными Empty Project

Нажать на кнопку Finish

Статическое подключение библиотеки в консольное приложение

Добавить в проект в папку Resources Files скомпилированный lib-файл библиотеки.

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

В продолжении примера, это можно сделать следующим образом:

extern «C» __declspec(dllimport) int TestFunction(int w, int h);

int multi = TestFunction(w, h);

Динамическое подключение библиотеки в консольное приложение

// тип указателя на функцию, имеющей прототип, который совпадает с прототипом импортируемой из библиотеки функции

typedef int (*TESTFUNCTION)(int, int);

int w = 10, h = 10, multi;

DWORD err;

printf(«Library was loaded\n»);

printf(«Couldn’t load dll. Error code %d\n», err);

// получение указателя на функцию библиотеки

TESTFUNCTION lpTestFunction = (TESTFUNCTION)GetProcAddress(hDll, «TestFunction»);

multi = (*lpTestFunction) (w, h);

printf(«multi = %d\n», multi);

// освобождение дескриптора

FreeLibrary(hDll);

Подключение библиотеки в Windows Forms приложение

Добавить ссылку на проект библиотеки (References).

Изменить в свойствах оконного приложения опцию компиляции на /clr.

Отключить использование Precompiled Headers.

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

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

Примечания:

Такая схема экспортирования функций библиотеки удобна в случае C-библиотеки. При наличии классов, содержащих виртуальные методы, возникает проблема линковки, если объявление и реализация разнесены в разных файлах. Решение:

Писать реализацию прямо при объявлении, что наименее предпочтительно.

Источник

Пошаговое руководство. Создание и использование статической библиотеки

В этом пошаговом руководстве описывается создание статической библиотеки (LIB-файла) для использования с приложениями C++. Статические библиотеки являются хорошим способом повторного использования кода. Вместо того чтобы каждый раз реализовывать одни и те же подпрограммы для обеспечения той или иной функциональности в каждом создаваемом приложении, их можно создать единожды и затем вызывать из приложений. Код, подключенный из статической библиотеки, становится частью вашего приложения — для использования кода не нужно устанавливать еще какой-либо файл.

В этом пошаговом руководстве рассматриваются следующие задачи:

Предварительные требования

Для работы необходимо владеть основами языка C++.

Создание проекта статической библиотеки

Инструкции по созданию проекта зависят от используемой версии Visual Studio. Чтобы ознакомиться с документацией по предпочтительной версии Visual Studio, используйте селектор Версия. Он находится в верхней части оглавления на этой странице.

Создание проекта статической библиотеки в Visual Studio

в верхней части диалогового окна задайте для параметра Language значение C++, задайте для параметра Platform значение Windowsи задайте для параметра Project тип значение Library.

В отфильтрованном списке типов проектов выберите пункт Мастер классических приложений Windows, а затем нажмите кнопку Далее.

На странице Настроить новый проект введите MathLibrary в поле Имя проекта. В поле Имя решения введите StaticMath. Нажмите кнопку Создать, чтобы открыть диалоговое окно Проект классического приложения Windows.

В разделе Дополнительные параметры снимите флажок Предварительно откомпилированный заголовок, если он установлен. Установите флажок Пустой проект.

Нажмите кнопку ОК, чтобы создать проект.

Создание проекта статической библиотеки в Visual Studio 2017

в строке меню выберите файл создать Project.

в диалоговом окне создание Project выберите установленный Visual C++ Windows рабочий стол. На центральной панели выберите Мастер классических приложений Windows.

В разделе Дополнительные параметры снимите флажок Предварительно откомпилированный заголовок, если он установлен. Установите флажок Пустой проект.

Нажмите кнопку ОК, чтобы создать проект.

Создание проекта статической библиотеки в Visual Studio 2015

в строке меню выберите файл создать Project.

в диалоговом окне создание Project выберите установленные шаблоны Visual C++ Win32. В центральной области выберите Консольное приложение Win32.

В мастере приложений Win32 нажмите кнопку Далее.

На странице Параметры приложения в разделе Тип приложения выберите Статическая библиотека. В разделе Дополнительные параметры снимите флажок Предварительно откомпилированный заголовок. Чтобы создать проект, нажмите кнопку Готово.

Добавление класса в статическую библиотеку

Добавление класса в статическую библиотеку

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

Добавьте объявление класса с именем Arithmetic для выполнения обычных арифметических операций, таких как сложение, вычитание, умножение и деление. Код должен выглядеть примерно так:

Чтобы создать исходный файл для нового класса, откройте контекстное меню проекта маслибрари в Обозреватель решений, а затем выберите добавить новый элемент.

Чтобы построить статическую библиотеку, выберите Сборкапостроить решение в строке меню. В результате будет создана статическая библиотека MathLibrary.lib, которая может использоваться другими программами.

Создание консольного приложения C++, ссылающегося на статическую библиотеку

Создание консольного приложения C++, ссылающегося на статическую библиотеку, в Visual Studio

В верхней части диалогового окна задайте для фильтра Тип проекта значение Консоль.

В отфильтрованном списке типов проектов щелкните Консольное приложение, а затем нажмите кнопку Далее. На следующей странице в поле Имя введите имя проекта MathClient.

Нажмите кнопку Создать, чтобы создать клиентский проект.

Создание консольного приложения C++, ссылающегося на статическую библиотеку, в Visual Studio 2017

в диалоговом окне добавление нового Project выберите установленный Visual C++ Windows рабочий стол. На центральной панели выберите Мастер классических приложений Windows.

В разделе Дополнительные параметры снимите флажок Предварительно откомпилированный заголовок, если он установлен.

Нажмите кнопку ОК, чтобы создать проект.

Создание консольного приложения C++, ссылающегося на статическую библиотеку, в Visual Studio 2015

в диалоговом окне добавление нового Project выберите установлено Visual C++ Win32. В центральной области выберите Консольное приложение Win32.

В диалоговом окне Мастер приложений Win32 нажмите кнопку Далее.

На странице Параметры приложения выберите в поле Тип приложения пункт Консольное приложение. В разделе Дополнительные параметры снимите флажок Предварительно откомпилированный заголовок, а затем установите флажок Пустой проект. Чтобы создать проект, нажмите кнопку Готово.

Чтобы добавить исходный файл в пустой проект, щелкните правой кнопкой мыши, чтобы открыть контекстное меню проекта масклиент в Обозреватель решений, а затем выберите команду добавить новый элемент.

Использование функциональности из статической библиотеки в приложении

Использование функциональности из статической библиотеки в приложении

Для использования математических процедур из статической библиотеки необходимо сослаться на эту библиотеку. Откройте контекстное меню проекта масклиент в Обозреватель решений, а затем выберите добавить ссылку.

В диалоговом окне Добавление ссылки перечислены библиотеки, на которые можно создать ссылку. На вкладке Проекты перечислены проекты текущего решения и все библиотеки, на которые они ссылаются. На вкладке Проекты установите флажок MathLibrary, а затем нажмите кнопку ОК.

Для создания ссылки на файл заголовка MathLibrary.h необходимо изменить путь к каталогам включаемых файлов. В обозревателе решений щелкните правой кнопкой мыши проект MathClient, чтобы открыть контекстное меню. Выберите пункт Свойства, чтобы открыть диалоговое окно Страницы свойств MathClient.

В диалоговом окне Страницы свойств MathClient в раскрывающемся списке Конфигурация выберите пункт Все конфигурации. В раскрывающемся списке Платформа выберите пункт Все платформы.

Чтобы найти путь к каталогу, выполните указанные ниже действия.

Откройте раскрывающийся список значений свойства Дополнительные каталоги включаемых файлов, а затем выберите Изменить.

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

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

В диалоговом окне Дополнительные каталоги включаемых файлов нажмите кнопку ОК.

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

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

Запустите приложение

Запуск приложения

Убедитесь в том, что проект MathClient выбран в качестве проекта по умолчанию. Чтобы выбрать его, в обозревателе решений откройте контекстное меню проекта MathClient и выберите команду Назначить запускаемым проектом.

Чтобы запустить проект, в строке меню выберите Отладка начать без отладки. Выходные данные должны выглядеть примерно так:

Источник

Использование библиотек и компонентов

Использование скачанных библиотек с помощью vcpkg

Если вы хотите использовать скачанную библиотеку с помощью диспетчера пакетов vcpkg, то приведенные ниже инструкции можно пропустить. Дополнительные сведения см. на странице о vcpkg.

Использование статических библиотек

Если проект статической библиотеки был создан в том же решении:

Если статическая библиотека не входит в состав решения:

Библиотеки динамической компоновки

Если библиотека DLL была собрана в рамках того же решения, что и приложение, выполните те же действия, что и для статической библиотеки.

Если библиотека DLL не входит в состав решения приложения, вам потребуются DLL-файл, заголовки с прототипами для экспортируемых функций и классов, а также LIB-файл, содержащий необходимую для компоновки информацию.

COM-объекты

Если в собственном приложении C++ требуется использовать COM-объект и этот объект зарегистрирован, вам достаточно вызвать функцию CoCreateInstance и передать в нее CLSID объекта. Система выполнит поиск объекта в реестре Windows и загрузит его. В проекте C++/CLI COM-объект можно использовать таким же образом. Кроме того, он может использовать его, добавив ссылку на него из списка Добавить ссылки com и используя его в вызываемой оболочке времени выполнения.

Свойства ссылки

Каждый тип ссылки имеет свойства. Свойства можно просмотреть, выбрав ссылку в обозревателе решений и нажав клавиши Alt + ВВОД. Также можно щелкнуть ссылку правой кнопкой мыши и выбрать пункт Свойства. Одни свойства доступны только для чтения, другие можно изменять. Тем не менее обычно эти свойства не требуется изменять вручную.

Свойства ссылки ActiveX

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

Управление полным путем

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

GUID элемента управления

Отображает GUID для элемента управления ActiveX.

Версия элемента управления

Отображает версию элемента управления ActiveX, на который указывает ссылка.

Имя библиотеки типов

Отображает имя библиотеки типов, на которую указывает ссылка.

Средство программы-оболочки

Отображает средство, которое используется для создания сборки взаимодействия из указанной библиотеки COM или элемента управления ActiveX.

Свойства ссылки на сборку (C++/CLI)

Относительный путь

Отображает относительный путь от каталога проекта к сборке, на которую указывает ссылка.

Свойства сборки

Следующие свойства доступны для различных типов ссылок. Они позволяют задавать способ построения со ссылками.

Копировать локальные

Указывает, следует ли автоматически копировать сборку, на которую указывает ссылка, в целевое расположение во время сборки.

Копировать локальные вспомогательные сборки (C++/CLI)

Выходные данные ссылочной сборки

Указывает, что эта сборка используется в процессе сборки. true означает, что эта сборка используется в командной строке компилятора во время выполнения сборки.

Свойства ссылок проектов на проекты

Следующие свойства определяют ссылку проекта на проект из проекта, выбранного в панели Ссылки, на другой проект в том же решении. Дополнительные сведения см. в статье Управление ссылками в проекте.

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

Если это свойство имеет значение True, система проектов установит в зависимом проекте связь с LIB-файлами, создаваемыми независимым проектом. Обычно устанавливается значение True.

Идентификатор проекта

Уникальный идентификатор независимого проекта. Значение свойства — это GUID внутренней системы, который невозможно изменить.

Использовать входные данные зависимостей библиотек

Если это свойство имеет значение False, система проектов не установит в зависимом проекте связь с OBJ-файлами для библиотеки, созданной независимым проектом. Таким образом, это значение отключает инкрементную компоновку. Обычно указывается значение False, так как при наличии множества независимых проектов сборка приложения может занять длительное время.

Имя сборки

Отображает имя сборки для сборки, на которую указывает ссылка.

Язык и региональные параметры

Отображает язык и региональные параметры выбранной ссылки.

Описание

Отображает описание выбранной ссылки.

Полный путь

Отображает путь к каталогу сборки, на которую указывает ссылка.

Удостоверение

Label

Отображает метку ссылки.

Name

Отображает имя ссылки.

Токен открытого ключа

Отображает токен открытого ключа для идентификации сборки, на которую указывает ссылка.

Строгое имя

Version

Отображает версию сборки, на которую указывает ссылка.

Источник

Библиотеки

Библиотеки позволяют использовать разработанный ранее программный код в различных программах. Таким образом, программист может не разрабатывать часть кода для своей программы, а воспользоваться тем, что входит в состав библиотек.

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

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

При компиляции программы библиотеки подключаются линковщиком, который вызывается gcc. Если программе требуются только стандартные библиотеки, то дополнительных параметров линковщику передавать не надо (есть исключения). Он «знает», где стандартные библиотеки находятся, и подключит их автоматически. Во всех остальных случаях при компиляции программы требуется указать имя библиотеки и ее местоположение.

Библиотеки бывают двух видов — статические и динамические. Код первых при компиляции полностью входит в состав исполняемого файла, что делает программу легко переносимой. Код динамических библиотек не входит в исполняемый файл, последний содержит лишь ссылку на библиотеку. Если динамическая библиотека будет удалена или перемещена в другое место, то программа работать не будет. С другой стороны, использование динамических библиотек позволяет сократить размер исполняемого файла. Также если в памяти находится две программы, использующие одну и туже динамическую библиотеку, то последняя будет загружена в память лишь единожды.

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

Пример создания библиотеки

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

В итоге, когда все будет сделано, схема каталогов и файлов будет выглядеть так:

Для компиляции проекта достаточно иметь только одну библиотеку: статическую или динамическую. В образовательных целях мы получим обе и сначала скомпилируем проект со статической библиотекой, потом — с динамической. Статическая и динамическая «разновидности» одной библиотеки по-идее должны называться одинаково (различаются только расширения). Поскольку у нас обе библиотеки будут находиться в одном каталоге, то чтобы быть уверенными, что при компиляции проекта мы используем ту, которую хотим, их названия различны (libmy1 и libmy2).

Исходный код библиотеки

В файле text.c определена единственная функция, принимающая указатель на символ строки. Функция выводит на экране звездочки в количестве, соответствующем длине указанной строки.

Заголовочный файл можно создать в каталоге source, но мы лучше сохраним его там, где будут библиотеки. В данном случае это на уровень выше (каталог library). Тем самым как бы подчеркивается, что файлы исходных кодов после создания из них библиотеки вообще не нужны пользователям библиотек, они нужны лишь разработчику библиотеки. А вот заголовочный файл библиотеки требуется для ее правильного использования.

Создание статической библиотеки

Статическую библиотеку создать проще, поэтому начнем с нее. Она создается из обычных объектных файлов путем их архивации с помощью утилиты ar.

Получаем объектные файлы:

В итоге в каталоге library должно наблюдаться следующее:

Далее используем утилиту ar для создания статической библиотеки:

Параметр r позволяет вставить файлы в архив, если архива нет, то он создается. Далее указывается имя архива, после чего перечисляются файлы, из которых архив создается.

Объектные файлы нам не нужны, поэтому их можно удалить:

В итоге содержимое каталога library должно выглядеть так:

, где libmy1.a — это статическая библиотека.

Создание динамической библиотеки

Использованные объектные файлы можно удалить:

В итоге содержимое каталога library:

Использование библиотеки в программе

Исходный код программы

Теперь в каталоге project (который у нас находится на одном уровне файловой иерархии с library) создадим файлы проекта, который будет использовать созданную библиотеку. Поскольку сама программа будет состоять не из одного файла, то придется здесь также создать заголовочный файл.

Обратите внимание на то, как подключается заголовочный файл библиотеки: через относительный адрес. Две точки обозначают переход в каталог на уровень выше, т.е. родительский по отношению к project, после чего путь продолжается во вложенный в родительский каталог library. Можно было бы указать абсолютный путь, например, «/home/pl/c/les22/library/mylib.h». Однако при перемещении каталогов библиотеки и программы на другой компьютер или в другой каталог адрес был бы уже не верным. В случае с относительным адресом требуется лишь сохранять расположение каталогов project и library относительно друг друга.

Здесь два раза вызывается библиотечная функция rect() и один раз функция data() из другого файла проекта. Чтобы сообщить функции main() прототип data() также подключается заголовочный файл проекта.

Файл project.h содержит всего одну строчку:

Из обоих файлов проекта с исходным кодом надо получить объектные файлы для объединения их потом с файлом библиотеки. Сначала мы получим исполняемый файл, содержащий статическую библиотеку, потом — связанный с динамической библиотекой. Однако с какой бы библиотекой мы не компоновали объектные файлы проекта, компилируются они как для статической, так и динамической библиотеки одинаково:

При этом не забудьте сделать каталог project текущим!

Компиляция проекта со статической библиотекой

Теперь в каталоге project есть два объектных файла: main.o и data.o. Их надо скомпилировать в исполняемый файл project, объединив со статической библиотекой libmy1.a. Делается это с помощью такой команды:

Запустив исполняемый файл project и выполнив программу, мы увидим на экране примерно следующее:

Посмотрим размер файла project:

Его размер равен 8698 байт.

Компиляция проекта с динамической библиотекой

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

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

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

Размер исполняемого файла проекта, связанного с динамической библиотекой, получился равным 8544 байта. Это немного меньше, чем при компиляции проекта со статической библиотекой. Если посмотреть на размеры библиотек:

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

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *