Как написать свою библиотеку на Си
Если ты встал на путь С/С++ разработчика, то скорее всего (помимо использования стандартной библиотеки — libc) рано или поздно вам потребуется занятся разработкой собственных библиотек. Зачем. Причин может быть несколько. Например вы написали свою структуру данных или свой алгоритм, и хотите использовать его повторно или распространять. Так же возможно вы написали несколько утилит и все они используют один и тот же кусок кода (например, как часто это бывает, логгер), и будет логично вынести этот кусок кода в отдельный модуль. Поскольку сопровождать такой код будет проще.
Реализация
И так, давайте начнем с примера. Создадим заголовочный файл somecode.h, который будет содержать объявление некоторой функции. Пусть будет простая функция которая разбивает предложение на слова и печатает каждое слово в новой строке. Простой синтетический пример.
И создадим файл somecode.c, в которой напишем реализацию нашей функции.
Далее создадим файл main.c, где будем вызывать нашу функцию.
Давайте для начала скомпилируем это все самым обычным способом для проверки работоспособности.
- из исходных файлов получаем объектные файлы
- из объектных файлов получаем исполняемый файл
Запускаем исполняемый файл и видим, что все работает.
А теперь рассмотрим пример получения библиотеки и линковки его к исполняемому файлу. Для компиляции используем вызов gcc со следующими опциями.
Из файла с расширением .c мы получаем файл с расширением .so. И так же обратите внимание, что библиотека имеет префикс lib. Еще мы видим, что появились два дополнительных аргумента -shared и -fpic. С помощью опции -shared мы говорим компилятору, что хотим получить а выходе библиотеку. А опция -fpic говорит компилятору, что объектные файлы должны содержать позиционно-независимый код (position independent code), который рекомендуется использовать для динамических библиотек.
Теперь скомпилируем наш исполняемый файл подключив к нему нашу библиотеку. Для этого нужно указать название библиотеки через опцию -l.
И опс.. мы получили ошибку… Линкер говорит нам, что он не знает где лежит наша библиотека. С помощью опции -L указываем текущую директорию, где лежит наша библиотека и компиляция проходит успешно.
Пытаемся запустить нашу и программу и ловим еще одну ошибку в котором говорится, что в процессе загрузки динамических библиотек отсуствует наша библиотека.
По умолчанию в операционной системе есть некоторое количество стандартных директорий, где должны располагатся библиотеки. Посмотреть этот список можно так.
Так же есть возможность задавать дополнительные директории с библиотеками с помощью переменной окружения LD_LIBRARY_PATH. С помощью утилиты ldd посмотрим от каких библиотек зависит наша программа.
Добавим в LD_LIBRARY_PATH текущую директорию.
Видим, что наша библиотека подгрузилась.
И теперь программа запускается и работает.
Если сравнить два исполняемых файла, то видим, что программа, которая использует динамическую библиотеку имеет меньший размер.
Это произошло как раз за счет того, что реализация нашей функции теперь лежит за пределами нашего исполняемого файла. С помощью утилиты objdump можем глянуть внутрь бинарных файлов. И увидим, что во втором бинарном файле реализация функции отсутствует, но присутствует в библиотеке.
Разница в нашем случае может и маленькая, но в масштабах десятков и сотен файлов разница будет значительной.
Так что же мы сделали?
У нас есть исходные файлы, мы скомпилировали их, получив из них динамическую библиотеку. Далее эту библиотеку можем использовать повторно в других проектах.
Примерно те же действия вы будете делать и под windows и под мак, будут немного другие компиляторы, но идея одна.
Как создать свою библиотеку в c
Нередко различные классы и структуры оформляются в виде отдельных библиотек, которые компилируются в файлы dll и затем могут подключаться в другие проекты. Благодаря этому мы можем определить один и тот же функционал в виде библиотеки классов и подключать в различные проекты или передавать на использование другим разработчикам.
Создадим и подключим библиотеку классов.
Возьмем имеющийся проект консольного приложения C#, например, созданный в прошлых темах. В структуре проекта нажмем правой кнопкой на название решения и далее в появившемся контекстном меню выберем Add -> New Project. (Добавить новый проект):

Далее в списке шаблонов проекта найдем пункт Class Library :

Затем дадим новому проекту какое-нибудь название, например, MyLib:

После создания этого проекта в решение будет добавлен новый проект, в моем случае с названием MyLib:

По умолчанию новый проект имеет один пустой класс Class1 в файле Class1.cs. Мы можем этот файл удалить или переименовать, как нам больше нравится.
Например, переименуем файл Class1.cs в Person.cs, а класс Class1 в Person. Определим в классе Person простейший код:

Теперь скомпилируем библиотеку классов. Для этого нажмем правой кнопкой на проект библиотеки классов и в контекстном меню выберем пункт Rebuild :

После компиляции библиотеки классов в папке проекта в каталоге bin/Debug/net6.0 мы сможем найти скомпилированный файл dll (MyLib.dll). Подключим его в основной проект. Для этого в основном проекте нажмем правой кнопкой на узел Dependencies и в контекстном меню выберем пункт Add Project Reference. :

Далее нам откроется окно для добавления библиотек. В этом окне выберем пункт Solution,который позволяет увидеть все библиотеки классов из проектов текущего решения, поставим отметку рядом с нашей библиотекой и нажмем на кнопку OK:

Если наша библиотека вдруг представляет файл dll, который не связан ни с каким проектом в нашем решении, то с помощью кнопки Browse мы можем найти местоположение файла dll и также его подключить.
Simple way of creating C/C++ DLL (Dynamic Link Library)
In this article, we discuss the use of Dynamic Link Library (DLL) with a simple example. These libraries contain code and data that can be used by third-party applications. By using a DLL, we will be able to promote code reuse and efficient memory usage. This technique will also allow us to modularize out programs into separate components that can each be used as needed.
Introduction to Dynamic Link Library
A DLL file (Dynamic Link Library) is a type of file that contains data and instructions that are used by other programs and can be called when needed. DLL files allow multiple programs to share functions and classes simultaneously. Unlike executable programs, DLL files cannot be run directly but instead must be called upon by some other program.
The word “dynamic” is used to explain that the data is not always available in memory, it is only put to use when the program actively calls for it. DLL files allow to separate a program into multiple unique components which can then be added or removed to include or exclude certain functionalities. This is very useful because it lowers the use of memory since the program does not need to load everything all at once.
C and C++
Microsoft Visual C++ provides multiple extensions to the standard C++ which allow functions and classes to be specified as imported or exported directly in the C++ code. These extensions use the attribute __declspec before a function or class declaration.
Please note that when accessing C functions or classes from C++, the functions must be declared as extern “C” in the C++ code, to inform the compiler not to mangle the functions or classes but rather use the “C” linkage. Because C++ supports function overloading, we can declare more than one functions with the same name and different parameters. We then need to provide the compiler with additional information on the function names to avoid undefined reference errors or linking errors (as C does not support function overloading).
The solution here is to specify extern “C” in our C++ program. When the compiler find an extern “C” block, it ensures that the function names are not mangled — that the compiler emits a binary file with their names unchanged, as a “C” compiler would do. This additional information allows us to avoid linking problems and conflicts in binary code.
Creating DLL
The example below is using Visual Studio 2019 to create and build a simple DLL:
Open Visual Studio and create a new Project. To specify that this is a DLL, we will need to select “Dynamic-Link Library with exports (DLL)”
After selecting a name for our project and a save location. We go ahead and open the “Header Files” folder that was generated ([ProjectName].h file):
The header file will be used to declare all our classes and functions. First, we define a C++ macro that exports the functions for third-party applications (Unity) that are going to be using the DLL to access functions and classes. This block is called conditional group.
We can remove the class and function examples since we will be writing our own functions for testing.
We create three simple functions. The first one displays a number, the second one displays a random number and the third one adds two numbers.
Please note that we are using extern “C” to avoid Name mangling as discussed above.
In our Solution Explorer, open the [ProjectName.cpp] file:
Now that we have our test functions. Let us Build our solution, but before, we need to make sure that we are building it to the correct expected 64-bit architecture. We need to compile our libraries for x64 platform (64-bit). To change this in Visual Studio, we can go to the Configuration Manager, then select x64 under “Platform”. Or simply select x64 from the drop-down menu at the top.
Our Solution builds successfully
To easily access the generated DLLs, right click on your Solution in the Solution Explorer and select “Open folder in File Explorer”
Conclusion
This article aims to provide an easy to follow example on how to create a Dynamic Link Library. In the next article, we will discuss how we can use this library from a third party software such as Unity3D to find a simple technique to integrate existing C/C++ code in Unity3D. Allowing us to use plugins to access already existing C/C++ methods and classes directly from our C# Unity script.
Программирование на C, C# и Java
Уроки программирования, алгоритмы, статьи, исходники, примеры программ и полезные советы
ОСТОРОЖНО МОШЕННИКИ! В последнее время в социальных сетях участились случаи предложения помощи в написании программ от лиц, прикрывающихся сайтом vscode.ru. Мы никогда не пишем первыми и не размещаем никакие материалы в посторонних группах ВК. Для связи с нами используйте исключительно эти контакты: vscoderu@yandex.ru, https://vk.com/vscode
Как создать dll в Visual Studio
DLL (Dynamic Link Library) — динамически подключаемая библиотека функций. Для библиотек DLL предполагается многократное использование различными программами. Поговорим о том, как создать библиотеку DLL в Visual Studio, используя языки программирования C и C#.
Создание dll на языке Си
Создаем в Visual Studio новый проект — консольное приложение.

В запустившемся «Мастере приложений Win32» жмем кнопку «Далее». В следующем окне выбираем тип приложения: «Библиотека DLL»; также ставим галочку напротив параметра «Пустой проект». Жмем кнопку «Готово».