Форум русскоязычного сообщества Ubuntu
Страница сгенерирована за 0.041 секунд. Запросов: 25.
- Сайт
- Об Ubuntu
- Скачать Ubuntu
- Семейство Ubuntu
- Новости
- Форум
- Помощь
- Правила
- Документация
- Пользовательская документация
- Официальная документация
- Семейство Ubuntu
- Материалы для загрузки
- Совместимость с оборудованием
- RSS лента
- Сообщество
- Наши проекты
- Местные сообщества
- Перевод Ubuntu
- Тестирование
- RSS лента
© 2012 Ubuntu-ru — Русскоязычное сообщество Ubuntu Linux.
© 2012 Canonical Ltd. Ubuntu и Canonical являются зарегистрированными торговыми знаками Canonical Ltd.
Схема динамического и статического подключения C/C++ библиотеки
В продолжении примера, это можно сделать следующим образом:
extern «C» __declspec(dllimport) int TestFunction(int w, int h);
int w = 10, h = 10;
int multi = TestFunction(w, h);
Динамическое подключение библиотеки в консольное приложение
Динамическое подключение предполагает, что библиотека подключается в приложение в момент его исполнения. Для этого необходимо использовать функцию библиотеки windows.h — LoadLibrary. Например, это можно реализовать следующим образом:
// тип указателя на функцию, имеющей прототип, который совпадает с прототипом импортируемой из библиотеки функции
typedef int (*TESTFUNCTION)(int, int);
int w = 10, h = 10, multi;
DWORD err;
HINSTANCE hDll = LoadLibrary(«dll.dll»); // dll.dll — название подключаемой библиотеки
printf(«Library was loaded\n»);
printf(«Couldn’t load dll. Error code %d\n», err);
// получение указателя на функцию библиотеки
TESTFUNCTION lpTestFunction = (TESTFUNCTION)GetProcAddress(hDll, «TestFunction»);
if (lpTestFunction != NULL)
multi = (*lpTestFunction) (w, h);
printf(«multi = %d\n», multi);
// освобождение дескриптора
FreeLibrary(hDll);
Подключение библиотеки в Windows Forms приложение
- Добавить ссылку на проект библиотеки (References).
- Изменить в свойствах оконного приложения опцию компиляции на /clr.
- Отключить использование Precompiled Headers.
- Прописать пути до заголовочных файлов библиотеки в свойствах проекта. Указать относительные пути, чтобы не было проблем при переносе проекта.
- В исходных кодах приложения подключить необходимые заголовочные файлы.
Примечания:
Такая схема экспортирования функций библиотеки удобна в случае C-библиотеки. При наличии классов, содержащих виртуальные методы, возникает проблема линковки, если объявление и реализация разнесены в разных файлах. Решение:
- Писать реализацию прямо при объявлении, что наименее предпочтительно.
- Создавать библиотеку с поддержкой clr (для этого создаем библиотеку по схеме, описанной выше, и выставляем в свойствах проекта Configuration Properties -> General -> Common Language Runtime Support опцию Common Language Runtime Support(/clr)) (пример библиотеки clrDll в архиве dlltest+WinForms+CRL DLL.7z). При подключении библиотеки в проект необходимо добавить ссылку на проект библиотеки (правой кнопкой мыши по проекту, Add References. Add New Reeference и выбираем проект библиотеки) (пример консольного приложение app4 в dlltest+WinForms+CRL DLL.7z).
Как добавить свою библиотеку в стандартные С++
Доброго времени суток, уважаемые форумчане!
Недавно стало интересно, можно ли добавить свою библиотеку к стандартным библиотекам с++.
Чтобы не добавлять ее каждый раз в новом проекте в файлы заголовков по новому и только потом include’ить.
Насколько я понял, для этого ее нужно запихнуть во внешние зависимости.
По сути, я хочу использовать эту библиотеку постоянно, как и без очередного добавления в файлы заголовком.
Подскажите, пожалуйста, как это сделать.
Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Как добавить свою библиотеку?
Может глупый вопрос, но как присоеденить к проекту свою библиотеку? Я создал библиотеку, в ней.
Как добавить в свою программу библиотеку со своими функциями?
написал библиотеку, но не знаю как подключить ее к программе
Требуется добавить свою библиотеку
Ребята, подскажите, пожалуйста, как добавить свою библиотеку классов в Unity3d ? чтобы можно было.
Не могу добавить Forms в свою библиотеку
using System.Windows.Forms; Начинает кричать что " System_Windows_Forms эта ссылка была.
Регистрация: 31.12.2017
Сообщений: 204
Сообщение от JohnBlack123
Недавно стало интересно, можно ли добавить свою библиотеку к стандартным библиотекам с++.
Можно добавить в ту же папку, исключительно ради удобства. Но для каждого проекта всё равно придётся непосредственно указывать, какие библиотеки вы линкуете. Зачем вам линковать всё подряд?
Сообщение от JohnBlack123
Чтобы не добавлять ее каждый раз в новом проекте в файлы заголовков по новому и только потом include’ить.
Что куда добавлять? Ваш вопрос непонятен. Как правило в IDE путь к папке с заголовочными файлами прописывается один раз, после чего можно спокойно include’ить всё, что лежит в этой папке.
Сообщение от JohnBlack123
хочу использовать эту библиотеку постоянно, как
iostream — не библиотека, а заголовочный файл.
215 / 162 / 52
Регистрация: 09.12.2017
Сообщений: 520
Сообщение от Jzx
Можно добавить в ту же папку, исключительно ради удобства. Но для каждого проекта всё равно придётся непосредственно указывать, какие библиотеки вы линкуете. Зачем вам линковать всё подряд?
Я не говорил о том, что желаю линковать все библиотеки. Имелось ввиду добавление моей библиотеки к стандартным библиотекам с/с++.
Сообщение от Jzx
Что куда добавлять? Ваш вопрос непонятен. Как правило в IDE путь к папке с заголовочными файлами прописывается один раз, после чего можно спокойно include’ить всё, что лежит в этой папке.
Чтобы использовать свою библиотеку нужно добавить ее в файлы заголовков (Visual Studio). Но, неудобство тут в том, что нужно в каждом новом проекте из раза в раз приходиться добавлять ее туда.
Сообщение от Jzx
iostream — не библиотека, а заголовочный файл.
Регистрация: 31.12.2017
Сообщений: 204
Сообщение от JohnBlack123
Чтобы использовать свою библиотеку нужно добавить ее в файлы заголовков (Visual Studio).
Проще говоря, я так понял, есть какая-то сторонняя библиотека и она сопровождается заголовками. Последние вам нужно явно указывать.
Сообщение от JohnBlack123
Но, неудобство тут в том, что нужно в каждом новом проекте из раза в раз приходиться добавлять ее туда.
Нелегко работать в VS. Факт.
Сообщение от JohnBlack123
Имелось ввиду добавление моей библиотеки к стандартным библиотекам с/с++.
В смысле? Включить какой-то посторонний объектный код в стандартную библиотеку? Сделать-то можно, конечно, только не понятно, зачем.
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
Вы можете написать скрипт, который сразу создаёт проект с прилинкованными к нему либами, и создавать проекты таким образом.
1502 / 427 / 93
Регистрация: 17.05.2015
Сообщений: 1,359
Сообщение было отмечено JohnBlack123 как решение
Решение
Сообщение от JohnBlack123
можно ли добавить свою библиотеку к стандартным библиотекам с++.
1.
Пользовательские библиотеки делятся на:
Debug|Win32 Debug|x64 Release|Win32 Release|x64
При этом, они так же бывают со статическим рантаймом или динамическим.
В виде .lib или в виде .dll.
2.
Приходим к пониманию, что стандартные библиотеки так же делятся на дебажные, и релизные.
На 32 битные и 64 битные.
На .dll и .lib
На статический рантайм и на динамический.
Что бы подмешать свою библиотеку к стандартным,
необходимо выполнить внедрение своей библиотеки
во всех обозначенных выше конфигурациях.
3.
Например, для внеднерения своей .lib
Находим любую стандартную библиотеку во всех обозначенных выше конфигурациях.
Для Visual Studio в качестве онной можно задействовать msvcrt.lib
Важно понимать, что если библиотека с таким именем находится в каталоге amd64 ,
то это — 64 битная версия.
Я хочу сказать, что по названию каталогов, где располагается библиотека,
можно догадаться какая у неё битность.
Как различить debug или relese — предмет особой олимпиады.
Для debug должны поставляться .pdb файлы с отладочной информацией.
4.
Теперь осуществляем внедрение.
Для этого разбираем стандартную библиотеку на запчасти.
Используем утилиту lib.exe , идущую в составе компилятора
lib.exe умеет разбирать .lib на .obj,
из которых она состоит,
и собирать их заново в итоговый .lib
Задача сводится к тому, чтобы разобрать стандартную и пользовательскую .lib
на запчасти и снова собрать в одну большую стандартную .lib
вот так выглядит эта процедура на cmake
#--- запускаем линкер, который разберет библиотеки на запчасти и заново собирет из них одну большую add_custom_target(combined ALL COMMAND lib /out:combined.lib $ $> )
5.
После проделанных манипуляций имеем стандартную .lib,
которая в своём составе включает пользовательскую библиотеку.
Теперь каждый раз, когда будет выполняться сборка проекта,
и компилятор автоматически подключит стандартную библиотеку,
вместе с ней автоматом подключится и пользовательский код.
6.
Все обозначенное выше необходимо проделать во всех версиях.
7.
С динамическими библиотеками дела обстоят гораздо хуже.
Мало того, что на пользовательской машинке dll может поставляться откуда то извне,
(не из состава Visual Studio), так их просто пропатчить сложнее, чем статическую .lib
8.
Не обходимо учесть, что рантайм может быть динамическим/статическим,
и.
9.
Думаю к этому моменту у любого здравомыслящего человека возникнет мысль:
«а может ну его нафиг. «
10.
Подключайте библиотеки к своим проектам нормальным штатным способом,
и будет вам счастье.
11.
Не нужно заниматься всяким извращением.
Добавлено через 13 минут
Сообщение от JohnBlack123
Недавно стало интересно, можно ли добавить свою библиотеку к стандартным библиотекам с++.
В Visual Studio можно очень легко подмешать свою .lib
Для этого:
1.
Выполняем поиск место расположения стандартного заголовка.
Например —
2.
В этом же каталоге размешаем свой пользовательский хэдер.
3.
Если вместе с хэдэром в сборку необходимо включить .lib файл пользовательской библиотеки,
тогда в пользовательском хэдере необходимо прописать:
#pragma comment (lib, "library.lib")
Вместо library.lib нужно пропечатать путь к вашей библиотеке.
Путь задается относительно хедера.
FAQ: Как подключить библиотеку на C/C++? Зачем файлы .h, .lib, .dll?
Этот вопрос довольно часто возникает у начинающих, а также у программистов, которые привыкли работать с языками, имеющими встроенную поддержку импорта из модулей (например, Delphi/Pascal).
В языке C исторически сложилось иначе. Чтобы подключить библиотеку к программе на языке C или C++, нужно выполнить два действия:
- Включить в исходный текст заголовочные файлы библиотеки (.h или .hpp) директивой #include
- Обеспечить, чтобы при сборке программы использовались соответствующие объектные файлы библиотеки (в зависимости от системы они могут иметь расширения .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 |