Пошаговое руководство. Создание и использование статической библиотеки
В этом пошаговом руководстве описывается создание статической библиотеки (LIB-файла) для использования с приложениями C++. Статические библиотеки являются хорошим способом повторного использования кода. Вместо того чтобы каждый раз реализовывать одни и те же подпрограммы для обеспечения той или иной функциональности в каждом создаваемом приложении, их можно создать единожды и затем вызывать из приложений. Код, подключенный из статической библиотеки, становится частью вашего приложения — для использования кода не нужно устанавливать еще какой-либо файл.
В этом пошаговом руководстве рассматриваются следующие задачи:
- Создание проекта статической библиотеки
- Добавление класса в статическую библиотеку
- Создание консольного приложения C++, ссылающегося на статическую библиотеку
- Использование функциональности из статической библиотеки в приложении
- Запуск приложения
Необходимые компоненты
Для работы необходимо владеть основами языка C++.
Создание проекта статической библиотеки
Инструкции по созданию проекта зависят от используемой версии Visual Studio. Чтобы ознакомиться с документацией по предпочтительной версии Visual Studio, используйте селектор Версия. Он находится в верхней части оглавления на этой странице.
Создание проекта статической библиотеки в Visual Studio
- В строке меню выберите «Файл>нового проекта«>, чтобы открыть диалоговое окно «Создать проект».
- В верхней части диалогового окна для параметра Язык установите значение C++, для параметра Платформа — значение Windows, а для параметра Тип проекта — значение Библиотека.
- В отфильтрованном списке типов проектов выберите пункт Мастер классических приложений Windows, а затем нажмите кнопку Далее.
- На странице Настроить новый проект введите MathLibrary в поле Имя проекта. В поле Имя решения введите StaticMath. Нажмите кнопку Создать, чтобы открыть диалоговое окно Проект классического приложения Windows.
- В диалоговом окне Проект классического приложения Windows в разделе Тип приложения выберите Статическая библиотека (.lib).
- В разделе Дополнительные параметры снимите флажок Предварительно откомпилированный заголовок, если он установлен. Установите флажок Пустой проект.
- Нажмите кнопку ОК, чтобы создать проект.
Создание проекта статической библиотеки в Visual Studio 2017
- В строке меню выберите Файл >Создать >Проект.
- В диалоговом окне Новый проект выберите Установленные>Visual C++>Классическое приложение для Windows. На центральной панели выберите Мастер классических приложений Windows.
- Укажите имя для проекта, например MathLibrary, в поле Имя. Укажите имя для решения, например StaticMath, в поле Имя решения. Нажмите кнопку ОК.
- В диалоговом окне Проект классического приложения Windows в разделе Тип приложения выберите Статическая библиотека (.lib).
- В разделе Дополнительные параметры снимите флажок Предварительно откомпилированный заголовок, если он установлен. Установите флажок Пустой проект.
- Нажмите кнопку ОК, чтобы создать проект.
Создание проекта статической библиотеки в Visual Studio 2015
- В строке меню выберите Файл >Создать >Проект.
- В диалоговом окне Новый проект выберите Установленные>Шаблоны>Visual C++>Win32. В центральной области выберите Консольное приложение Win32.
- Укажите имя для проекта, например MathLibrary, в поле Имя. Укажите имя для решения, например StaticMath, в поле Имя решения. Нажмите кнопку ОК.
- В мастере приложений Win32 нажмите кнопку Далее.
- На странице Параметры приложения в разделе Тип приложения выберите Статическая библиотека. В разделе Дополнительные параметры снимите флажок Предварительно откомпилированный заголовок. Чтобы создать проект, нажмите кнопку Готово.
Добавление класса в статическую библиотеку
Добавление класса в статическую библиотеку
- Чтобы создать файл заголовка для нового класса откройте контекстное меню проекта MathLibrary в обозревателе решений, а затем выберите Добавить>Новый элемент.
- В диалоговом окне Добавление нового элемента выберите пункт Visual C++>Код. В центральной области выберите Заголовочный файл (.h). Укажите имя для файла заголовка, например MathLibrary.h, и нажмите кнопку Добавить. Отобразится почти пустой файл заголовка.
- Добавьте объявление класса с именем Arithmetic для выполнения обычных арифметических операций, таких как сложение, вычитание, умножение и деление. Код должен выглядеть примерно так:
// MathLibrary.h #pragma once namespace MathLibrary < class Arithmetic < public: // Returns a + b static double Add(double a, double b); // Returns a - b static double Subtract(double a, double b); // Returns a * b static double Multiply(double a, double b); // Returns a / b static double Divide(double a, double b); >; >
// MathLibrary.cpp // compile with: cl /c /EHsc MathLibrary.cpp // post-build command: lib MathLibrary.obj #include "MathLibrary.h" namespace MathLibrary < double Arithmetic::Add(double a, double b) < return a + b; >double Arithmetic::Subtract(double a, double b) < return a - b; >double Arithmetic::Multiply(double a, double b) < return a * b; >double Arithmetic::Divide(double a, double b) < return a / b; >>
Примечание. При выполнении сборки из командной строки Visual Studio программа собирается в два этапа. Сначала выполните компиляцию cl /c /EHsc MathLibrary.cpp кода и создайте файл объекта с именем MathLibrary.obj. (Команда cl вызывает компилятор, Cl.exe и /c параметр указывает компиляцию без связывания. Дополнительные сведения см. в разделе Параметр /c (компиляция без связывания). Во-вторых, запустите файл lib MathLibrary.obj , чтобы связать код и создать статическую библиотеку MathLibrary.lib. (Команда lib вызывает диспетчер библиотек, Lib.exe. Дополнительные сведения см. в справочнике по LIB.)
Создание консольного приложения C++, ссылающегося на статическую библиотеку
Создание консольного приложения C++, ссылающегося на статическую библиотеку, в Visual Studio
- В обозревателе решений щелкните правой кнопкой мыши узел верхнего уровня Решение StaticMath, чтобы открыть контекстное меню. Выберите пункты Добавить>Новый проект, чтобы открыть диалоговое окно Добавить новый проект.
- В верхней части диалогового окна задайте для фильтра Тип проекта значение Консоль.
- В отфильтрованном списке типов проектов щелкните Консольное приложение, а затем нажмите кнопку Далее. На следующей странице в поле Имя введите имя проекта MathClient.
- Нажмите кнопку Создать, чтобы создать клиентский проект.
- После создания консольного приложения будет создана пустая программа. Имя исходного файла будет совпадать с ранее выбранным именем. В этом примере он имеет имя MathClient.cpp .
Создание консольного приложения C++, ссылающегося на статическую библиотеку, в Visual Studio 2017
- В обозревателе решений щелкните правой кнопкой мыши узел верхнего уровня Решение StaticMath, чтобы открыть контекстное меню. Выберите пункты Добавить>Новый проект, чтобы открыть диалоговое окно Добавить новый проект.
- В диалоговом окне Добавление нового проекта выберите Установленные>Visual C++>Классическое приложение для Windows. На центральной панели выберите Мастер классических приложений Windows.
- Укажите имя для проекта, например MathClient, в поле Имя. Нажмите кнопку ОК.
- В диалоговом окне Проект классического приложения Windows в разделе Тип приложения выберите Консольное приложение (EXE).
- В разделе Дополнительные параметры снимите флажок Предварительно откомпилированный заголовок, если он установлен.
- Нажмите кнопку ОК, чтобы создать проект.
- После создания консольного приложения будет создана пустая программа. Имя исходного файла будет совпадать с ранее выбранным именем. В этом примере он имеет имя MathClient.cpp .
Создание консольного приложения C++, ссылающегося на статическую библиотеку, в Visual Studio 2015
- В обозревателе решений щелкните правой кнопкой мыши узел верхнего уровня Решение StaticMath, чтобы открыть контекстное меню. Выберите пункты Добавить>Новый проект, чтобы открыть диалоговое окно Добавить новый проект.
- В диалоговом окне Добавление нового проекта выберите Установленные>Visual C++>Win32. В центральной области выберите Консольное приложение Win32.
- Укажите имя для проекта, например MathClient, в поле Имя. Нажмите кнопку ОК.
- В диалоговом окне Мастер приложений Win32 нажмите кнопку Далее.
- На странице Параметры приложения выберите в поле Тип приложения пункт Консольное приложение. В разделе Дополнительные параметры снимите флажок Предварительно откомпилированный заголовок, а затем установите флажок Пустой проект. Чтобы создать проект, нажмите кнопку Готово.
- Чтобы добавить исходный файл в пустой проект, щелкните правой кнопкой мыши, чтобы открыть контекстное меню проекта MathClient в Обозреватель решений, а затем нажмите кнопку «Добавить >новый элемент».
- В диалоговом окне Добавление нового элемента выберите пункт Visual C++>Код. В центральной области выберите Файл C++ (.cpp). Укажите имя исходного файла, например MathClient.cpp, и нажмите кнопку Добавить. Отобразится пустой исходный файл.
Использование функциональности из статической библиотеки в приложении
Использование функциональности из статической библиотеки в приложении
- Для использования математических процедур из статической библиотеки необходимо сослаться на эту библиотеку. В обозревателе решений откройте контекстное меню проекта MathClient, а затем выберите команду Добавить>Ссылка.
- В диалоговом окне Добавление ссылки перечислены библиотеки, на которые можно создать ссылку. На вкладке Проекты перечислены проекты текущего решения и все библиотеки, на которые они ссылаются. На вкладке Проекты установите флажок MathLibrary, а затем нажмите кнопку ОК.
- Для создания ссылки на файл заголовка MathLibrary.h необходимо изменить путь к каталогам включаемых файлов. В обозревателе решений щелкните правой кнопкой мыши проект MathClient, чтобы открыть контекстное меню. Выберите пункт Свойства, чтобы открыть диалоговое окно Страницы свойств MathClient.
- В диалоговом окне Страницы свойств MathClient в раскрывающемся списке Конфигурация выберите пункт Все конфигурации. В раскрывающемся списке Платформа выберите пункт Все платформы.
- Перейдите на страницу свойств Свойства конфигурации>C/C++>Общие. В свойстве Дополнительные каталоги включаемых файлов укажите путь к каталогу MathLibrary или найдите этот каталог. Чтобы найти путь к каталогу, выполните указанные ниже действия.
- Откройте раскрывающийся список значений свойства Дополнительные каталоги включаемых файлов, а затем выберите Изменить.
- В диалоговом окне Дополнительные каталоги включаемых файлов дважды щелкните в верхней части текстового поля. Нажмите кнопку с многоточием (. ) в конце строки.
- В диалоговом окне Выбор каталога перейдите на уровень вверх и выберите каталог MathLibrary. Затем нажмите кнопку Выбрать папку, чтобы сохранить выбор.
- В диалоговом окне Дополнительные каталоги включаемых файлов нажмите кнопку ОК.
- В диалоговом окне Страницы свойств нажмите кнопку OK, чтобы сохранить изменения в проекте.
// MathClient.cpp // compile with: cl /EHsc MathClient.cpp /link MathLibrary.lib #include #include "MathLibrary.h" int main() < double a = 7.4; int b = 99; std::cout
Выполнить приложение
Запуск приложения
- Убедитесь в том, что проект MathClient выбран в качестве проекта по умолчанию. Чтобы выбрать его, в обозревателе решений откройте контекстное меню проекта MathClient и выберите команду Назначить запускаемым проектом.
- Чтобы запустить проект, в строке меню выберите Отладка>Запуск без отладки. Выходные данные должны выглядеть примерно так:
a + b = 106.4 a - b = -91.6 a * b = 732.6 a / b = 0.0747475Создание статической библиотеки на С++ для работы с большими числами
Я всегда слышал, что с библиотеками в С++ что-то не так, как и с ограничением максимального целочисленного значения, да и вообще то, что язык сложный и непонятный. Что же, сегодня, мы начнём писать собственную библиотеку больших чисел, полностью своими руками c 0, и узнаем, так ли страшен С++, как его малюют?
Если вы не разбираетесь в С++, не переживайте, эта статья имеет нулевой порог вхождения. Мы начнём с лёгкого, но вы даже не заметите, как начнёте разбираться в более сложных и непонятных, на первый взгляд, вещах. Главное, писать код логично. Думаю, данная статья будет интересна не только начинающим, ведь я постарался затронуть достаточно много тем. (для старожилов: моя цель не сделать оптимизирование или быстрее, а показать, что С++ не такой уж и сложный язык программирования. И да, я знаю, что существуют другие библиотеки, которые делают это быстрее и лучше. И да, было бы круче, если бы мы использовали булевую алгебру. И да, С++ про вечную оптимизацию, но это статья не про это. Спасибо.)
За сегодня мы узнаем, что такое: Перегрузка функций/конструкторов, прототипы функций, обработка исключений, пространство имён, псевдонимы типов, заголовок.h, как пользоваться отладчиком и как писать продвинутые/красивые комментарии. Пристёгивайтесь, будет безумно интересно.
▍ Предисловие и планы
С++ строготипизированный язык программирования, где максимально возможное значение целочисленной переменной, является максимальное значение unsigned long long int (где-то 18 446 744 073 709 551 615). Этого бывает недостаточно, поэтому я решил разработать собственную библиотеку больших чисел (BigNumLib). Единственное ограничение размерности BigNumLib переменной – это количество цифр, из которого будет состоять число, то есть, максимально в число поместится 4 294 967 295 цифр.
▍ Начало разработки
Итак, начинаем разработку! Для начала нам необходимо продумать логику и возможности нашего собственного типа данных. Как мы создадим свой тип данных? В ЯП С++ нельзя расширить стандартные типы (int, double и т.п.), поэтому, единственный возможный вариант, который у нас остался, это работа через struct и class.
Чем отличаются Struct и Class?
Ответ: единственное различие между ними, так это то, что в struct модификаторы доступа по умолчанию public, а в class — private. Также отличается и наследование по умолчанию.
Итак, откроем Visual Studio с пустым проектом. Создадим папки (если они не созданы): “Файлы заголовков” с файлом BigNumLib.h и “Исходные файлы” с файлами Main.cpp, BigNumLib.cpp. У кого трудности на данном этапе, ничего страшного, ниже представлены фото и gif.
Как создать и настроить проект


В файле заголовка (.h), можно заметить строчку #pragma once. Что это?
Ответ: В языках программирования С и C++ #pragma once — нестандартная, но широко распространённая препроцессорная директива, разработанная для контроля за тем, чтобы конкретный исходный файл при компиляции подключался строго один раз.
Здесь, в этом файле заголовка, мы будем создавать прототипы функций (функции без тела) и вообще описывать весь класс, например, какие дополнительные библиотеки будут подключены, для исправной работы нашей, или какие функции будут доступны пользователю, а какие нет (модификаторы доступа public, private). Зачем мы вообще создали данный заголовок? Всё просто, чтобы подключить внешний код, необходимо использовать именно заголовок.
▍ Создание bignum класса
Итак, для начала нам необходимо создать класс и его поля:
class bignum
Ловим ошибку, что не подключили библиотеку и подключаем:
#include
Итак, что мы написали?
_value = здесь будет храниться наше число в виде строки
_size = из скольких цифр состоит наше число (размер). size_t это псевдоним, то есть, то же самое что и unsigned int (положительные целые числа)
_isNegative = является ли отрицательным числом. (true или false)
bignum() = конструктор класса. Он вызывается при создании экземпляра класса.
private: – поле, где доступ к данным имеет лишь класс. Приватные переменные, как правило, пишутся через ‘_’.
Так отлично, теперь откроем BigNumLib.cpp и напишем там такой код:
#include "bignum.h" bignum::bignum()
Здесь мы подключили наш заголовок и описали конструктор класса, где доступ к конструктору мы получаем через пространство имён ( bignum:: )
Теперь мы можем открыть наш основной файл ( Main.cpp ) и проверить работу библиотеки:
#include "BigNumLib.h" int main()
// Важное замечание, локальные заголовки, которые находятся в одном решении, подключаются с помощью кавычек.
Что же, теперь ставим точку остановы на return 0 , и смотрим нашу переменную.
Отлично, всё работает! По поводу отладчика, это безумно удобный интерфейс. Как сказал один мудрый человек, если программист не умеет пользоваться отладчиком, то этот человек не программист. Краткий экскурс по данному чуду: f5 (запуск отладки), shift+f5 (остановка), ctrl+shift+f5 (перезапуск), f10 (шаг с заходом в функцию), f11 (шаг с обходом функции), shift+f11 (шаг с выходом из функции), f5 (во время отладки, перейти к следующей точке остановы).
▍ Геттеры
Так, теперь создадим функцию геттер, чтобы иметь возможность читать поле нашего класса. Для этого объявим эту функцию в BigNumLib.h (файл заголовок) в поле public :
//@return string std::string getValue();Мы написали комментарии в стиле DOC++. Этот тип комментариев понимает Visual Studio и красиво отображает нам. (ключевые слова пишутся через ‘@’: @return, @param )

Теперь необходимо прописать логику данных функций в BigNumLib.cpp .
std::string bignum::getValue() < std::string _value = this->_value; if (this->_isNegative) _value.insert(0, "-"); return _value; >Чтобы обратиться к внутренним полям класса, мы используем указатель this , таким образом, пользователь имеет доступ к переменной _value только на чтение.
В функции getValue() мы создаём локальную переменную _value и заполняем её данными лежащими в поле класса. Если поле _isNegative имеет значение true (число отрицательно), то мы вставляем в начало строки ‘-’. (insert(позиция, знак))
Отлично, теперь проверим наш код в действии!
#include "BigNumLib.h" #include int main() < bignum a; std::cout
▍ Перегрузка конструктора (приём int)
Далее нам необходимо создать перегрузку конструктора класса, который на вход принимает long long int. Для этого объявим:
BigNumLib.h
public: bignum(long long int other_value);BigNumLib.cpp
bignum::bignum(long long other_value)
Перегрузка конструктора \ функции \ оператора – это когда они имеют одно и то же имя, но принимают разные параметры. Та или иная функция вызывается в зависимости от принимаемых ею аргументов.
Здесь, мы впервые использовали тернарный оператор. Сокращённое написание конструкции if, else . Всё предельно просто, если на вход поступает отрицательное число, то поле _isNegative становится true . После чего, число переводится в строку и если число отрицательное, то удаляется первый символ из строки (‘-’).
Сейчас мы можем протестировать это и присвоить число. Попробуем присвоить положительное и отрицательное число, посмотрим, правильно ли работает наша программа:

Отлично, теперь попробуем ввести огромное число:

Как мы можем видеть, Visual Studio запрещает нам присваивать такое огромное число, потому что оно выходит за рамки long long int (превысив значение самого большого стандартного типа). Как мы будем обходить данный запрет? С помощью строки, ведь она, практически безгранична.
▍ Перегрузка конструктора (приём string, char*)
Создадим конструктор и пару функций в файле заголовка.
public: bignum(const char* other_value); bignum(std::string other_value); private: void parsStringToBigNumParams();BigNumLib.cpp
bignum::bignum(const char* other_value) < _value = other_value; parsStringToBigNumParams(); >bignum::bignum(std::string other_value) < _value = other_value; parsStringToBigNumParams(); >void bignum::parsStringToBigNumParams() < if (_value[0] == '-') < _value = _value.erase(0, 1); _isNegative = true; >else _isNegative = false; if (_value.find_first_not_of("0123456789") != std::string::npos) throw std::runtime_error(_value + " it's not a number!"); _size = _value.size(); >Мы написали 2 конструктора, где один из них принимает string, а другой массив char. Зачем? Потому что в случае, когда после присвоения сразу записывается значение, то будет массив char. А если создать string переменную и присвоить уже её, то активируется другой конструктор (со string параметром).

По поводу функции parsStringToBigNumParams() . Данная функция превращает строку, в набор параметров нашего класса. В начале она проверяет, стоит ли ‘-’, на первой позиции в _value , если да, убрать знак из строки и присвоить параметру _isNegative = true . После чего идёт проверка, если в _value найдено, что какой-то элемент не совпадает с цифирным набором (npos — не найдено совпадений), то выкинуть исключение. И дальше присвоить размер.
Что делает исключение? Полностью останавливает работу программы, если его не обработать. Давайте же опробуем работу наших конструкторов и обработаем исключение:

Как работает обработка исключений? В блоке try пишется небезопасный код, если в нём происходит ошибка, мы тут же попадаем в блок catch . Из-за того, что мы добавили описание в нашу самодельную ошибку, мы можем увидеть, какое значение, смогло сломать нашу библиотеку.
▍ Заключение
Что же, я чувствую, что выдал достаточно много инфы и, если продолжить, у новичков она может превратиться в кашу. За сегодня мы прошли очень много интересных тем и познакомились с некоторыми особенностями языка С++, но впереди ещё больше крутой информации, такая как перегрузка операторов, указатели, resize string и собственная логика в математических операциях. Если вам заходит такой формат обучения/разработки реального проекта, дайте знать, буду пилить 2 часть в таком же формате, ну, если вы вообще ждёте 2 часть 🙂

- c++
- c++ библиотеки
- visual c++
- visual studio
- создание библиотек
- написание библиотек
- большие числа
- большие данные
- ruvds_статьи
- Блог компании RUVDS.com
- C++
- Visual Studio
Лабораторный практикум по основам языка C/С++
Тема 5.1. Подключение библиотеки SFML в Visual Studio и CODEBLOCKS
В мире достаточно много программистов, которые готовы поделиться результатами своего труда с коллегами. Часто это просто команда единомышленников, которые начинают создавать продукт для своей команды, а затем пускают его в "свободное плавание", хотят поделиться удачной реализацией алгоритмов или самоутвердиться. Другим часто встречающимся случаем является публикация результатов научной или какой-либо другой академической деятельности.
Свободно распространяемых и закрытых библиотек очень много. Поэтому, в целях экономии времени, более оправданным является использовать уже готовых библиотек функций и классов, нежели создавать все "с нуля".
Обычно библиотеку подключают к какому либо проекту, прописывая пути к файлам библиотеки в настройках проекта. Это довольно-таки простой процесс. Для этого необходимо выполнить несколько действий:
- Получить архив с бинарными файлами библиотеки и распаковать его в какой-нибудь локальный каталог.
- Прописать в настройках IDE пути к каталогам библиотеки: include и lib
Далее можно создать шаблон проекта специально для данной библиотеки, чтобы при создании нового файла с исходными текстами не повторять каждый раз одни и те же действия.
Создайте на пользовательском диске каталог с именем SFML_Lib и распакуйте в него соответствующий архив. В каталоге юудут представлены следующие подкаталоги:

В каталоге bin расположены скомпилированные windows-библиотеки (dll-файлы). Если при запуске программ будет выдаваться сообщение, что невозможно найти ту или иную библиотеку, то еследует в переменных среды прописать путь к этому каталогу.
В каталогах lib и include располагаются файлы, необходимые на этапе компиляции программ. Пути к этим каталогам следует прописать в настройках проекта.
В каталоге doc располагается документация к библиотеке на английском языке
В каталоге examples располагаются примеры готовых приложений, написанных с использованием библиотеки SFML.
Подключение библиотеки в Visual Studio
Создайте простой консольный проект Win32. Затем откройте настройки проекта Project – Properties. . Для подключения файлов, необходимых для разработки, установите значения свойств так, как показано на рисунках:

После этого можно писать код с использованием библиотеки SFML.
Создание шаблона
© УГАТУ, кафедра ВВТиС, А.Т.Бикмеев — 2016
Создание библиотеки с помощью Visual Studio
Обычно используют связку файлов "libname.h" и "libname.cpp". В "libname.h" пишут определения классов и объявление функций, а в "libname.cpp" пишут определения этих функций. Если Вам понадобится Ваша библиотека, Вы должны добавить эти два файла в проект и написать
#include "libname.h"в тех файлах, где Вы хотите использовать свою библиотеку.
Отслеживать
ответ дан 6 окт 2011 в 15:45
3,245 16 16 серебряных знаков 32 32 бронзовых знака
как правильно создать заголовочный файл ?
6 окт 2011 в 15:48
Конкретно в MS VS: в проекте правый клик по 'Header Files' -> Add -> New item.
6 окт 2011 в 15:51
а как правильно его оформлять ?
6 окт 2011 в 16:27
Если Вам нужен пример - посмотрите любой проект, скажем, на code.google.com
6 окт 2011 в 16:31- c++
- visual-studio
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.11.15.1019
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
