Перейти к содержимому

Как создать собственную библиотеку в си

  • автор:

Как создать собственную библиотеку в си

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

Давайте вернемся к проекту из шага «Шаг 3 — Компиляция нескольких файлов» и создадим из файлов f1.c и f2.c отдельную библиотеку. Для начала компилируем эти файлы:

dron:~# gcc -c f1.c f2.c

В результате получим, как обычно, два файла — f1.o и f2.o. Для того, чтобы создать библиотеку из объектых файлов надо вызвать программу ar со следующими параметрами:

ar rc libимя_библиотеки.a [список_*.o_файлов] 

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

dron:~# ar rc libfs.a f1.o f2.o

В результате получим файл libfs.a, в котором будут лежать копии объектых файлов f1.o и f2.o. Если файл библиотеки уже существует, то архиватор будет анализировать содержимое архива, он добавит новые объектные файлы и заменит старые обновленными версиями. Опция c заставляет создавать (от create) библиотеку, если ее нет, а опция r (от replace) заменяет старые объектные файлы новыми версиями.

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

ranlib libимя_библиотеки.a

Программа ranlib добавит индекс к архиву и получится полноценная статическая библиотека объектных файлов. Стоит отметить, что на некоторых системах программа ar автоматически создает индекс, и использование ranlib не имеет никакого эффекта. Но тут надо быть осторожным при атоматической компиляции библиотеки с помощью файлов makefile, если вы не будете использовать утилиту ranlib, то возможно на каких-то системах библиотеки будут создаваться не верно и потеряется независимость от платформы. Так что возьмем за правило тот факт, что утилиту ranlib надо запускать в любом случае, даже если он нее нет никакого эффекта.

Для компиляции нашего основного файла main.c надо сообщить компилятору, что надо использовать библиотеки. Чтобы компилятор знал где искать библиотеки ему надо сообщить каталог, в котором они содержатся и список этих билиотек. Каталог с библиотеками указывается ключом -L, в нашем случае библиотека находится в текущем каталоге, значит путь до нее будет в виде точки (-L.). Используемые библиотеки перечисляются через ключ -l, после которого указывается название библиотеки без префикса lib и окончания .a. В нашем случае этот ключ будет выглядеть, как -lfs. Теперь все одной командой:

dron:~# gcc -c main.c dron:~# gcc main.o -L. -lfs -o rezult

Или можно чуть короче:

dron:~# gcc main.c -L. -lfs -o rezult

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

dron:~# gcc -c main.c -L. -lfs gcc: -lfs: linker input file unused since linking not done

Что означает, что файлы библиотек не нужны, до процесса линковки. Данная команда создаст лишь файл main.o, который в итоге потом придется собирать отдельно.

Создание статической библиотеки на С++ для работы с большими числами

Я всегда слышал, что с библиотеками в С++ что-то не так, как и с ограничением максимального целочисленного значения, да и вообще то, что язык сложный и непонятный. Что же, сегодня, мы начнём писать собственную библиотеку больших чисел, полностью своими руками 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.

Как создать и настроить проект

image

image

В файле заголовка (.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 )

image

Теперь необходимо прописать логику данных функций в 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 . После чего, число переводится в строку и если число отрицательное, то удаляется первый символ из строки (‘-’).

Сейчас мы можем протестировать это и присвоить число. Попробуем присвоить положительное и отрицательное число, посмотрим, правильно ли работает наша программа:

image

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

image

Как мы можем видеть, 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 параметром).

image

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

Что делает исключение? Полностью останавливает работу программы, если его не обработать. Давайте же опробуем работу наших конструкторов и обработаем исключение:

image

Как работает обработка исключений? В блоке try пишется небезопасный код, если в нём происходит ошибка, мы тут же попадаем в блок catch . Из-за того, что мы добавили описание в нашу самодельную ошибку, мы можем увидеть, какое значение, смогло сломать нашу библиотеку.

▍ Заключение

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

  • c++
  • c++ библиотеки
  • visual c++
  • visual studio
  • создание библиотек
  • написание библиотек
  • большие числа
  • большие данные
  • ruvds_статьи
  • Блог компании RUVDS.com
  • C++
  • Visual Studio

FAQ: Как подключить библиотеку на C/C++? Зачем файлы .h, .lib, .dll?

Этот вопрос довольно часто возникает у начинающих, а также у программистов, которые привыкли работать с языками, имеющими встроенную поддержку импорта из модулей (например, Delphi/Pascal).

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

  1. Включить в исходный текст заголовочные файлы библиотеки (.h или .hpp) директивой #include
  2. Обеспечить, чтобы при сборке программы использовались соответствующие объектные файлы библиотеки (в зависимости от системы они могут иметь расширения .lib, .a, .o, .obj и т.д.) В зависимости от используемого компилятора это делается разными способами, например:
    – добавить файл(ы) в проект как объектные;
    – в MS Visual Studio: добавить имя файла в Linker->Input->Additional Dependencies (если файл в другом каталоге, путь добавить в Linker->General->Additional Library Directories);
    – при использовании make прописать файл в список файлов для линкера (обычно это LIBS= или т.п.).
    А если библиотека представлена в исходных текстах, надо просто добавить все нужные .c (.cpp) файлы в проект программы.

Файлы .lib должны быть совместимы с используемым компилятором и ОС. Поэтому к библиотеке может прилагаться несколько наборов файлов для разных сред.

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

В чём смысл этих действий, зачем нужны все эти разные файлы?

Файл заголовков (.h) нужен для того, чтобы компилятор мог распознать идентификаторы (имена макросов, типов, переменных, функций), которые определены в библиотеке. Специального средства для импорта имён в стандартном C нет, и для этого используется директива препроцессора #include, которая вставляет включаемый файл как исходный текст, как если бы он был написан вместо директивы #include.

В файлах .h идентификаторы объявляются, но не определяются (decalared but not defined), т.е. под переменные не выделяется пространство, а функции не имеют кода. Это достигается использованием ключевого слова extern для переменных, а для функций даются прототипы, например:

/* mylib.h */
extern int mylib_global_variable;
int mylib_function(int x, int y);

Если эти объявления включить через #include, то компилятор сможет скомпилировать .c файл, в котором упоминаются mylib_global_variable и mylib_function, например:

/* myprog.c */
#include "mylib.h"
int main(void)
mylib_global_variable = 1;
return mylib_function(mylib_global_variable, 2);
>

После компиляции получится объектный файл (например, myprog.o), причем в нём эти идентификаторы будут описаны как внешние. Но линкер не сможет собрать такую программу в готовый исполнимый файл, потому что для этих идентификаторов нет определений, т.е. есть имена, но нет "тела".
При попытке собрать программу будет выдано сообщение об ошибке "undefined external".

Теперь нужно, чтобы при сборке программы нашёлся объектный файл, в котором реализованы все эти переменные и функции. Допустим, у нас есть исходный текст библиотеки – например, такой:

/* mylib.c */
int mylib_global_variable = 0;
int mylib_function(int x, int y)
return x + y;
>

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

Если же библиотека уже скомпилирована отдельно, то нужно взять готовые объектные файлы (.lib или .a – это по сути контейнеры объектных файлов) и передать их линкеру.

Это в общих чертах всё, что касается статических библиотек, т.е. таких, код которых попадает в исполнимый файл основной программы.

О динамических библиотеках следует сказать отдельно. Динамическая библиотека отличается тем, что её код хранится в отдельном файле (Windows – .dll, в системах типа GNU/Linux и FreeBSD – .so) и загружается операционной системой при запуске программы, либо самой программой по мере надобности.

Рассмотрим оба способа на примере Windows.

Чтобы подключить динамическую библиотеку с загрузкой при запуске, используются файлы .h и .lib – точно так же, как в случае статической библиотеки. Просто в данном случае .lib файл содержит не сам код, а ссылки на импортируемые функции из DLL, так что после компиляции получается .exe файл, в котором есть ссылки на нужную DLL. Файл .dll при компиляции не нужен, зато нужен при запуске (в каталоге с .exe файлом, в системных каталогах Windows, в каталогах, перечисленных в переменной окружения PATH и т.д.).

Также можно загружать динамическую библиотеку "вручную" функциями LoadLibrary и GetProcAddress. Тогда .lib файл не нужен вообще, а .h включить обычно нужно (чтобы иметь описания типов и констант-макросов), но к функциям обращаться нужно будет не по именам из .h, а через указатели соответствующих типов, например:
/* . */
typedef int (*my_funct_ptr_t)(int, int); /* тип указателя на функцию */
HINSTANCE h_dll;
my_func_ptr_t func;
int x = 1, y = 2, z;
h_dll = LoadLibrary("mylib.dll");
if (NULL == h_dll) return MY_ERROR_CANNOT_LOAD_DLL;
func = (my_func_ptr_t)GetProcAddress(h_dll, "mylib_function");
if (NULL == func) return MY_ERROR_FUNCTION_NOT_FOUND;
z = func(x, y);
/* . */

Перейти к другим статьям FAQ

Cтатья создана: 14.08.2014
Последняя редакция: 04.08.2016

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

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

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

  • Создание проекта статической библиотеки
  • Добавление класса в статическую библиотеку
  • Создание консольного приложения C++, ссылающегося на статическую библиотеку
  • Использование функциональности из статической библиотеки в приложении
  • Запуск приложения

Необходимые компоненты

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

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

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

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

  1. В строке меню выберите "Файл>нового проекта">, чтобы открыть диалоговое окно "Создать проект".
  2. В верхней части диалогового окна для параметра Язык установите значение C++, для параметра Платформа — значение Windows, а для параметра Тип проекта — значение Библиотека.
  3. В отфильтрованном списке типов проектов выберите пункт Мастер классических приложений Windows, а затем нажмите кнопку Далее.
  4. На странице Настроить новый проект введите MathLibrary в поле Имя проекта. В поле Имя решения введите StaticMath. Нажмите кнопку Создать, чтобы открыть диалоговое окно Проект классического приложения Windows.
  5. В диалоговом окне Проект классического приложения Windows в разделе Тип приложения выберите Статическая библиотека (.lib).
  6. В разделе Дополнительные параметры снимите флажок Предварительно откомпилированный заголовок, если он установлен. Установите флажок Пустой проект.
  7. Нажмите кнопку ОК, чтобы создать проект.

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

  1. В строке меню выберите Файл >Создать >Проект.
  2. В диалоговом окне Новый проект выберите Установленные>Visual C++>Классическое приложение для Windows. На центральной панели выберите Мастер классических приложений Windows.
  3. Укажите имя для проекта, например MathLibrary, в поле Имя. Укажите имя для решения, например StaticMath, в поле Имя решения. Нажмите кнопку ОК.
  4. В диалоговом окне Проект классического приложения Windows в разделе Тип приложения выберите Статическая библиотека (.lib).
  5. В разделе Дополнительные параметры снимите флажок Предварительно откомпилированный заголовок, если он установлен. Установите флажок Пустой проект.
  6. Нажмите кнопку ОК, чтобы создать проект.

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

  1. В строке меню выберите Файл >Создать >Проект.
  2. В диалоговом окне Новый проект выберите Установленные>Шаблоны>Visual C++>Win32. В центральной области выберите Консольное приложение Win32.
  3. Укажите имя для проекта, например MathLibrary, в поле Имя. Укажите имя для решения, например StaticMath, в поле Имя решения. Нажмите кнопку ОК.
  4. В мастере приложений Win32 нажмите кнопку Далее.
  5. На странице Параметры приложения в разделе Тип приложения выберите Статическая библиотека. В разделе Дополнительные параметры снимите флажок Предварительно откомпилированный заголовок. Чтобы создать проект, нажмите кнопку Готово.

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

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

  1. Чтобы создать файл заголовка для нового класса откройте контекстное меню проекта MathLibrary в обозревателе решений, а затем выберите Добавить>Новый элемент.
  2. В диалоговом окне Добавление нового элемента выберите пункт Visual C++>Код. В центральной области выберите Заголовочный файл (.h). Укажите имя для файла заголовка, например MathLibrary.h, и нажмите кнопку Добавить. Отобразится почти пустой файл заголовка.
  3. Добавьте объявление класса с именем 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

  1. В обозревателе решений щелкните правой кнопкой мыши узел верхнего уровня Решение StaticMath, чтобы открыть контекстное меню. Выберите пункты Добавить>Новый проект, чтобы открыть диалоговое окно Добавить новый проект.
  2. В верхней части диалогового окна задайте для фильтра Тип проекта значение Консоль.
  3. В отфильтрованном списке типов проектов щелкните Консольное приложение, а затем нажмите кнопку Далее. На следующей странице в поле Имя введите имя проекта MathClient.
  4. Нажмите кнопку Создать, чтобы создать клиентский проект.
  5. После создания консольного приложения будет создана пустая программа. Имя исходного файла будет совпадать с ранее выбранным именем. В этом примере он имеет имя MathClient.cpp .

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

  1. В обозревателе решений щелкните правой кнопкой мыши узел верхнего уровня Решение StaticMath, чтобы открыть контекстное меню. Выберите пункты Добавить>Новый проект, чтобы открыть диалоговое окно Добавить новый проект.
  2. В диалоговом окне Добавление нового проекта выберите Установленные>Visual C++>Классическое приложение для Windows. На центральной панели выберите Мастер классических приложений Windows.
  3. Укажите имя для проекта, например MathClient, в поле Имя. Нажмите кнопку ОК.
  4. В диалоговом окне Проект классического приложения Windows в разделе Тип приложения выберите Консольное приложение (EXE).
  5. В разделе Дополнительные параметры снимите флажок Предварительно откомпилированный заголовок, если он установлен.
  6. Нажмите кнопку ОК, чтобы создать проект.
  7. После создания консольного приложения будет создана пустая программа. Имя исходного файла будет совпадать с ранее выбранным именем. В этом примере он имеет имя MathClient.cpp .

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

  1. В обозревателе решений щелкните правой кнопкой мыши узел верхнего уровня Решение StaticMath, чтобы открыть контекстное меню. Выберите пункты Добавить>Новый проект, чтобы открыть диалоговое окно Добавить новый проект.
  2. В диалоговом окне Добавление нового проекта выберите Установленные>Visual C++>Win32. В центральной области выберите Консольное приложение Win32.
  3. Укажите имя для проекта, например MathClient, в поле Имя. Нажмите кнопку ОК.
  4. В диалоговом окне Мастер приложений Win32 нажмите кнопку Далее.
  5. На странице Параметры приложения выберите в поле Тип приложения пункт Консольное приложение. В разделе Дополнительные параметры снимите флажок Предварительно откомпилированный заголовок, а затем установите флажок Пустой проект. Чтобы создать проект, нажмите кнопку Готово.
  6. Чтобы добавить исходный файл в пустой проект, щелкните правой кнопкой мыши, чтобы открыть контекстное меню проекта MathClient в Обозреватель решений, а затем нажмите кнопку "Добавить >новый элемент".
  7. В диалоговом окне Добавление нового элемента выберите пункт Visual C++>Код. В центральной области выберите Файл C++ (.cpp). Укажите имя исходного файла, например MathClient.cpp, и нажмите кнопку Добавить. Отобразится пустой исходный файл.

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

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

  1. Для использования математических процедур из статической библиотеки необходимо сослаться на эту библиотеку. В обозревателе решений откройте контекстное меню проекта MathClient, а затем выберите команду Добавить>Ссылка.
  2. В диалоговом окне Добавление ссылки перечислены библиотеки, на которые можно создать ссылку. На вкладке Проекты перечислены проекты текущего решения и все библиотеки, на которые они ссылаются. На вкладке Проекты установите флажок MathLibrary, а затем нажмите кнопку ОК.
  3. Для создания ссылки на файл заголовка MathLibrary.h необходимо изменить путь к каталогам включаемых файлов. В обозревателе решений щелкните правой кнопкой мыши проект MathClient, чтобы открыть контекстное меню. Выберите пункт Свойства, чтобы открыть диалоговое окно Страницы свойств MathClient.
  4. В диалоговом окне Страницы свойств MathClient в раскрывающемся списке Конфигурация выберите пункт Все конфигурации. В раскрывающемся списке Платформа выберите пункт Все платформы.
  5. Перейдите на страницу свойств Свойства конфигурации>C/C++>Общие. В свойстве Дополнительные каталоги включаемых файлов укажите путь к каталогу MathLibrary или найдите этот каталог. Чтобы найти путь к каталогу, выполните указанные ниже действия.
    1. Откройте раскрывающийся список значений свойства Дополнительные каталоги включаемых файлов, а затем выберите Изменить.
    2. В диалоговом окне Дополнительные каталоги включаемых файлов дважды щелкните в верхней части текстового поля. Нажмите кнопку с многоточием (. ) в конце строки.
    3. В диалоговом окне Выбор каталога перейдите на уровень вверх и выберите каталог MathLibrary. Затем нажмите кнопку Выбрать папку, чтобы сохранить выбор.
    4. В диалоговом окне Дополнительные каталоги включаемых файлов нажмите кнопку ОК.
    5. В диалоговом окне Страницы свойств нажмите кнопку 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 
    

    Выполнить приложение

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

    1. Убедитесь в том, что проект MathClient выбран в качестве проекта по умолчанию. Чтобы выбрать его, в обозревателе решений откройте контекстное меню проекта MathClient и выберите команду Назначить запускаемым проектом.
    2. Чтобы запустить проект, в строке меню выберите Отладка>Запуск без отладки. Выходные данные должны выглядеть примерно так:
    a + b = 106.4 a - b = -91.6 a * b = 732.6 a / b = 0.0747475 

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

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