Как создать библиотеку c
Нередко различные классы и структуры оформляются в виде отдельных библиотек, которые компилируются в файлы dll и затем могут подключаться в другие проекты. Благодаря этому мы можем определить один и тот же функционал в виде библиотеки классов и подключать в различные проекты или передавать на использование другим разработчикам.
Создадим и подключим библиотеку классов.
Возьмем имеющийся проект консольного приложения C#, например, созданный в прошлых темах. В структуре проекта нажмем правой кнопкой на название решения и далее в появившемся контекстном меню выберем Add -> New Project. (Добавить новый проект):
Далее в списке шаблонов проекта найдем пункт Class Library :
Затем дадим новому проекту какое-нибудь название, например, MyLib:
После создания этого проекта в решение будет добавлен новый проект, в моем случае с названием MyLib:
По умолчанию новый проект имеет один пустой класс Class1 в файле Class1.cs. Мы можем этот файл удалить или переименовать, как нам больше нравится.
Например, переименуем файл Class1.cs в Person.cs, а класс Class1 в Person. Определим в классе Person простейший код:
namespace MyLib < public class Person < string name; public Person(string name) < this.name = name; >public void Print() => Console.WriteLine($"Name: "); > >
Теперь скомпилируем библиотеку классов. Для этого нажмем правой кнопкой на проект библиотеки классов и в контекстном меню выберем пункт Rebuild :
После компиляции библиотеки классов в папке проекта в каталоге bin/Debug/net6.0 мы сможем найти скомпилированный файл dll (MyLib.dll). Подключим его в основной проект. Для этого в основном проекте нажмем правой кнопкой на узел Dependencies и в контекстном меню выберем пункт Add Project Reference. :
Далее нам откроется окно для добавления библиотек. В этом окне выберем пункт Solution,который позволяет увидеть все библиотеки классов из проектов текущего решения, поставим отметку рядом с нашей библиотекой и нажмем на кнопку OK:
Если наша библиотека вдруг представляет файл dll, который не связан ни с каким проектом в нашем решении, то с помощью кнопки Browse мы можем найти местоположение файла dll и также его подключить.
После успешного подключения библиотеки в главном проекте изменим файл Program.cs , чтобы он использовал класс Person из библиотеки классов:
using MyLib; // подключение пространства имен из библиотеки классов Person tom = new("Tom"); tom.Print(); // Name: Tom
Как создать свою библиотеку функций?
Создать библиотеку функций, Dev-C
Разбираюсь с функциями, в моей программе их очень много. Решила сократить поместить функции в.
Как написать свою библиотеку функций?
Я только начинаю изучать программирование на С++, параллельно разбираюсь с ООП. Вообще идеи ООП.
Как создать свою библиотеку?
Как создать свою библиотеку со своими функциями и включить ее в основную программу?
Как создать свою библиотеку
Есть несколько понятий в которых путаюсь. библиотека — какой-то файл заголовочный файл — файл с.
Как создать свою библиотеку?
Много времени потратила на поиски какой-нибудь информации о том, как создать статическую .
361 / 262 / 107
Регистрация: 28.04.2015
Сообщений: 1,611
разбей на ТРИ файла:
*.h — для декларации типов данных (в том числе константы туда можно засунуть, имхо, при необходимости андефнишь, если нужна локализация)
*.c — для пользовательских функций
*.c — для главной, где вызывается функция main
заинклюдишь *.h через «» из обоих файлов *.c да и все
3882 / 2481 / 418
Регистрация: 09.09.2017
Сообщений: 10,895
Сообщение от lv veta
Выдает ошибку, не могу понять делаю ли всё правильно
Ну, если выдает ошибку, то, наверное, не все правильно.
Такое ощущение, что вы пытаетесь библиотеку собрать как исполняемый файл. То есть компилятор ищет точку входа (main), не находит и на это ругается.
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Как создать свою граф.библиотеку?
А как создать свою графическую библиотеку? С чего начать?
Как создать свою библиотеку для протоколирования?
Мне нужно создать свою библиотеку которая будет выводить логи 3 или 4 уровни логирования : Info -.
WinAvr +AVRStudio как создать свою библиотеку?
Вопрос 1. Как создать свою простенькую библотеку с функциями? (те что через #ymstude <*.h>.
Создать свою библиотеку, чтобы она автоматически подключалась проектам, как это делает System.Linq
Хочу создать свою библиотеку. Нашел информацию, как создавать такие библиотеки VS и использовать.
Создать свою библиотеку в С++
Разработать библиотеку в C++ для двумерного массива
Создать свою библиотеку
Создать свою библиотеку в с++,двумерный массив ,что бы выполнялось условие сортировки и поиска.
Или воспользуйтесь поиском по форуму:
Библиотеки в Си. Сборка программы со статической и динамической библиотеками
Библиотеки позволяют использовать созданный ранее программный код в различных программах. Таким образом, программист может не разрабатывать часть кода для своей программы, а воспользоваться тем, что входит в состав библиотек.
В языке программирования C код библиотек представляет собой функции, размещенные в файлах, которые скомпилированы в объектные файлы, а те, в свою очередь, объединены в библиотеки. В одной библиотеке объединяются функции, решающие определенный тип задач. Например, существует библиотека математических функций.
У каждой библиотеки должен быть свой заголовочный файл, в котором должны быть описаны прототипы (объявления) всех функций, содержащихся в этой библиотеке. С помощью заголовочных файлов вы «сообщаете» вашему программному коду, какие библиотечные функции есть и как их использовать.
При компиляции программы библиотеки подключаются линковщиком, который вызывается gcc . Если программе требуются только стандартные библиотеки, то дополнительных параметров линковщику передавать не надо (есть исключения). Он «знает», где стандартные библиотеки находятся, и подключит их автоматически. Во всех остальных случаях при компиляции программы требуется указать имя библиотеки и ее местоположение.
Библиотеки бывают двух видов — статические и динамические. Код первых при компиляции полностью входит в состав исполняемого файла, что делает программу легко переносимой. Код динамических библиотек не входит в исполняемый файл, последний содержит лишь ссылку на библиотеку. Если динамическая библиотека будет удалена или перемещена в другое место, то программа работать не будет. С другой стороны, использование динамических библиотек позволяет сократить размер исполняемого файла. Также если в памяти находится две программы, использующие одну и туже динамическую библиотеку, то последняя будет загружена в память лишь единожды.
Далее будет описан пример, в котором создается библиотека, после чего используется при создании программы.
Пример создания библиотеки
Допустим, мы хотим создать код, который в дальнейшем планируем использовать в нескольких проектах. Следовательно, нам требуется создать библиотеку. Ее исходный код разместим в двух файлах.
Также у нас будет проект, использующая эту библиотеку. Он тоже будет включать два файла.
В итоге, когда все будет сделано, схема каталогов и файлов будет выглядеть так:
Пусть каталоги library и project находятся в одном общем каталоге, например, домашнем каталоге пользователя. Каталог library содержит каталог source с файлами исходных кодов библиотеки. Также в library будут находиться заголовочный файл (содержащий описания функций библиотеки), статическая ( libmy1.a ) и динамическая ( libmy2.so ) библиотеки. Каталог project будет содержать файлы исходных кодов проекта и заголовочный файл с описанием функций проекта. Также после компиляции с подключением библиотеки здесь будет располагаться исполняемый файл проекта.
В операционных системах GNU/Linux имена файлов библиотек должны иметь префикс «lib», статические библиотеки — расширение *.a , динамические — *.so .
Для компиляции проекта достаточно иметь только одну библиотеку: статическую или динамическую. В образовательных целях мы получим обе и сначала скомпилируем проект со статической библиотекой, потом — с динамической. Статическая и динамическая «разновидности» одной библиотеки по-идее должны называться одинаково (различаются только расширения). Поскольку у нас обе библиотеки будут находиться в одном каталоге, то чтобы быть уверенными, что при компиляции проекта мы используем ту, которую хотим, их названия различны ( libmy1 и libmy2 ).
Исходный код библиотеки
#include void rect(char sign, int w, int h) int i, j; for (i = 0; i w; i++) putchar(sign); putchar('\n'); for (i = 0; i h-2; i++) { for (j = 0; j w; j++) { if (j == 0 putchar('\n'); } for (i = 0; i w; i++) putchar(sign); putchar('\n'); } void diagonals(char sign, int w) putchar('\n'); } }
В файле figure.c содержатся две функции — rect и diagonals . Первая принимает в качестве аргументов символ и два числа и «рисует» на экране с помощью указанного символа прямоугольник заданной ширины и высоты. Вторая функция выводит на экране две диагонали квадрата («рисует» крестик).
#include void text(char *ch) { while (*ch++ != '\0') putchar('*'); putchar('\n'); }
В файле text.c определена единственная функция, принимающая указатель на символ строки. Функция выводит на экране звездочки в количестве, соответствующем длине указанной строки.
void rect(char sign, int width, int height); void diagonals(char sign, int width); void text(char *ch);
Заголовочный файл можно создать в каталоге source , но мы лучше сохраним его там, где будут библиотеки. В данном случае это на уровень выше (каталог library ). Тем самым как бы подчеркивается, что файлы исходных кодов после создания из них библиотеки вообще не нужны пользователям библиотек, они нужны лишь разработчику библиотеки. А вот заголовочный файл библиотеки требуется для ее правильного использования.
Создание статической библиотеки
Статическую библиотеку создать проще, поэтому начнем с нее. Она создается из обычных объектных файлов путем их архивации с помощью утилиты ar .
Все действия, которые описаны ниже выполняются в каталоге library (т.е. туда надо перейти командой cd ). Просмотр содержимого каталога выполняется с помощью команды ls или ls -l .
Получаем объектные файлы:
gcc -c ./source/*.c
В итоге в каталоге library должно наблюдаться следующее:
figures.o mylib.h source text.o
Далее используем утилиту ar для создания статической библиотеки:
ar r libmy1.a *.o
Параметр r позволяет вставить файлы в архив, если архива нет, то он создается. Далее указывается имя архива, после чего перечисляются файлы, из которых архив создается.
Объектные файлы нам не нужны, поэтому их можно удалить:
rm *.o
В итоге содержимое каталога library должно выглядеть так:
libmy1.a mylib.h source
, где libmy1.a — это статическая библиотека.
Создание динамической библиотеки
Объектные файлы для динамической библиотеки компилируются особым образом. Они должны содержать так называемый позиционно-независимый код (position independent code). Наличие такого кода позволяет библиотеке подключаться к программе, когда последняя загружается в память. Это связано с тем, что библиотека и программа не являются единой программой, а значит как угодно могут располагаться в памяти относительно друг друга. Компиляция объектных файлов для динамической библиотеки должна выполняться с опцией -fPIC компилятора gcc :
gcc -c -fPIC source/*.c
В отличие от статической библиотеки динамическую создают при помощи gcc указав опцию -shared :
gcc -shared -o libmy2.so *.o
Использованные объектные файлы можно удалить:
rm *.o
В итоге содержимое каталога library :
libmy1.a libmy2.so mylib.h source
Использование библиотеки в программе
Исходный код программы
Теперь в каталоге project (который у нас находится на одном уровне файловой иерархии с library ) создадим файлы проекта, который будет использовать созданную библиотеку. Поскольку сама программа будет состоять не из одного файла, то придется здесь также создать заголовочный файл.
#include #include "../library/mylib.h" void data(void) { char strs[3][30]; char *prompts[3] = { "Ваше имя: ", "Местонахождение: ", "Пунк прибытия: "}; int i; for (i = 0; i 3; i++) { printf("%s", prompts[i]); fgets(strs[i], 30, stdin); } diagonals('~', 7); for (i = 0; i 3; i++) { printf("%s", prompts[i]); text(strs[i]); } }
Функция data запрашивает у пользователя данные, помещая их в массив strs . Далее вызывает библиотечную функцию diagonals() , которая выводит на экране «крестик». После этого на каждой итерации цикла вызывается библиотечная функция text() , которой передается очередной элемент массива; функция text выводит на экране звездочки в количестве равном длине переданной через указатель строки.
Обратите внимание на то, как подключается заголовочный файл библиотеки: через относительный адрес. Две точки обозначают переход в каталог на уровень выше, т. е. родительский по отношению к project , после чего путь продолжается в каталог library , вложенный в родительский. Можно было бы указать абсолютный путь, например, «/home/pl/c/les22/library/mylib.h». Однако при перемещении каталогов библиотеки и программы на другой компьютер или в другой каталог адрес был бы уже не верным. В случае с относительным адресом требуется лишь сохранять расположение каталогов project и library относительно друг друга.
#include #include "../library/mylib.h" #include "project.h" int main() { rect('-',75,4); data(); rect('+',75,3); }
Здесь два раза вызывается библиотечная функция rect() и один раз функция data() из другого файла проекта. Чтобы сообщить функции main прототип data также подключается заголовочный файл проекта.
Файл project.h содержит всего одну строчку:
void data(void);
Из обоих файлов проекта с исходным кодом надо получить объектные файлы для объединения их потом с файлом библиотеки. Сначала мы получим исполняемый файл, содержащий статическую библиотеку, потом — связанный с динамической библиотекой. Однако с какой бы библиотекой мы не компоновали объектные файлы проекта, компилируются они как для статической, так и динамической библиотеки одинаково:
gcc -c *.c
При этом не забудьте сделать каталог project текущим!
Компиляция проекта со статической библиотекой
Теперь в каталоге project есть два объектных файла: main.o и data.o . Их надо скомпилировать в исполняемый файл project , объединив со статической библиотекой libmy1.a . Делается это с помощью такой команды:
gcc -o project *.o -L../library -lmy1
Начало команды должно быть понятно: опция -o указывает на то, что компилируется исполняемый файл project из объектных файлов.
Помимо объектных файлов проекта в компиляции участвует и библиотека. Об этом свидетельствует вторая часть команды: -L../library -lmy1 . Здесь опция -L указывает на адрес каталога, где находится библиотека, он и следует сразу за ней. После опции -l записывается имя библиотеки, при этом префикс lib и суффикс (неважно .a или .so ) усекаются. Обратите внимание, что после данных опций пробел не ставится.
Опцию -L можно не указывать, если библиотека располагается в стандартных для данной системы каталогах для библиотек. Например, в GNU/Linux это /lib/ , /urs/lib/ и др.
Запустив исполняемый файл project и выполнив программу, мы увидим на экране примерно следующее:
Посмотрим размер файла project :
pl@desk:~/c/les22/project$ ls -l project -rwxrwxr-x 1 pl pl 16352 дек 19 02:02 project
Его размер равен 16352 байт.
Компиляция проекта с динамической библиотекой
Теперь удалим исполняемый файл и получим его уже связанным с динамической библиотекой. Команда компиляции с динамической библиотекой выглядит так (одна команда разбита на две строки с помощью обратного слэша и перехода на новую строку):
gcc -o project *.o \ > -L../library -lmy2 -Wl,-rpath. /library/
Здесь в отличии от команды компиляции со статической библиотеки добавлены опции для линковщика: -Wl,-rpath. /library/ . -Wl ‒ это обращение к линковщику, -rpath ‒ опция линковщика, ../library/ ‒ значение опции. Получается, что в команде мы два раза указываем местоположение библиотеки: один раз с опцией -L , а второй раз с опцией -rpath .
Следует заметить, что если вы скомпилируете программу, используя приведенную команду, то исполняемый файл будет запускаться из командной строки только в том случае, если текущий каталог project . Стоит сменить каталог, будет возникать ошибка из-за того, что динамическая библиотека не будет найдена. Но если скомпилировать программу так:
gcc -o project *.o -L../library -lmy2 \ > -Wl,-rpath,/home/pl/c/library
, т.е. указать для линковщика абсолютный адрес, то программа в данной системе будет запускаться из любого каталога.
Размер исполняемого файла проекта, связанного с динамической библиотекой, будет немного меньше. Если посмотреть на размеры библиотек:
pl@desk:~/c/les22/library$ ls -l libmy* -rw-rw-r-- 1 pl pl 3616 дек 19 00:16 libmy1.a -rwxrwxr-x 1 pl pl 15592 дек 19 00:33 libmy2.so
, то видно, что динамическая больше статической, хотя исполняемый файл проекта со статической библиотекой больше. Это доказывает, что в исполняемом файле, связанном с динамической библиотекой, присутствует лишь ссылка на нее.
Курс с решением задач:
pdf-версия
Как использовать статическую библиотеку?
Есть проект на C, и имеется статическая библиотека (.lib), как теперь подключить эту библиотеку к объектному коду моего проекта (для создания объектного кода моего проекта я использую следующую конструкцию: gcc -c somefile.c). Я пробовал использовать #pragma comment(lib, «libname.lib») но такой способ не прошёл, при компиляции я получаю сообщения вроде: undefined reference to ‘funcname’. Ещё я пробовал сначала создать somefile.o, а потом при помощи линковщика (ld) связать их так: ld somefile.o libname.lib. Вопрос, как правильно подключать статические библиотеки к объектному коду, и как эти библиотеки лучше всего компилировать (я использую cl.exe, потому что с gcc у меня не получается). Примечания: gcc v8.2.0 ОС Win 8 x86 (хотя компилятор и ОС скорее всего не имеют значения).
Отслеживать
задан 17 мая 2019 в 4:48
781 4 4 серебряных знака 17 17 бронзовых знаков
Если кратко и судя по описанному — никак. У gcc и cl разные ABI (грубо говоря, формат бинарных файлов) и прицепить библиотеку от VS к gcc 8.2 не сможете. Нужно собрать библиотеку той же версией (с той же разрядностью) gcc . И потом, можно будет использовать параметр -l (буква ‘эль’) для библиотеки при сборке, типа: gcc file.c -lname , где name — краткое имя библиотеки, а полное имя тогда будет вида libname.a .
17 мая 2019 в 5:12
Вроде бы mingw может линковаться и нормально работать с чисто сишными .lib , но нужно проверять. Еще, если не секрет, где вы нашли gcc 8.2 для windows?