использовать функцию из библиотеки
предположим, все пути указаны верно. можно ли в своем приложении пользоваться функцией function без динамической подгрузки функции через dlopen ?
#include int main() < ex a; function(a); //
если кому не сложно, то накидайте этот пример и покажите как вызвать функцию без dlopen. не понимаю
Отслеживать
задан 17 дек 2017 в 13:35
2,642 1 1 золотой знак 17 17 серебряных знаков 31 31 бронзовый знак
Прилинковать include.so
17 дек 2017 в 13:40
прилинковываю, и что дальше?
17 дек 2017 в 13:46
Всё должно работать. Если не работает, то значит прилинковали не правильно. Укажите, как именно вы линкуете и из каких папок запускаете приложение.
17 дек 2017 в 13:52
@VTT, исправил. замечу что в include.h нету объявления функции foo
17 дек 2017 в 14:18
Как вы пытаетесь обратиться к функции не объявив ее? Откуда компилятору знать, что и где искать? И никто не мешает прямо в main() написать прототип Вашей функции.
17 дек 2017 в 20:03
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
alexander@goblin /tmp/foolib $ cat foo.cpp #include int foo () < std::cout alexander@goblin /tmp/foolib $ cat main-foo.cpp int foo (); int main () < return foo(); >alexander@goblin /tmp/foolib $ g++ -shared -fpic -olibfoo.so foo.cpp alexander@goblin /tmp/foolib $ g++ -fpic -o main-foo -L. -lfoo main-foo.cpp alexander@goblin /tmp/foolib $ LD_LIBRARY_PATH=. ./main-foo Hello world from foo!
Отслеживать
ответ дан 18 дек 2017 в 9:08
23.2k 1 1 золотой знак 19 19 серебряных знаков 38 38 бронзовых знаков
да, спасибо, Vladimir подсказал что надо было тупо объявить функцию у себя в main.cpp
18 дек 2017 в 9:28
не заметил скрытые комментарии сначала.
18 дек 2017 в 9:39
- c++
- linux
- dll
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.4.30.8420
Пошаговое руководство. Создание и использование статической библиотеки
В этом пошаговом руководстве описывается создание статической библиотеки (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
Указатель на функцию из библиотеки на Си в С++ класс?
Вопрос такой: как обрабатывать вызовы указателя на функцию в С++ классе?
MainWindow::MainWindow(QWidget *parent). < my = my_new(); my->send_sms = this->test; .
Но компилятор говорит, что функция test должна быть статическим членом класса, а если я её делаю статической, то не могу обрабатывать события из си библиотеки занося их результаты в поля класса окно через this. И всё что мне остаётся, это выводить какойнить MessageBox. Хотел сделать статический сигнал, но компилятор тоже ругается. Мне нужно присваивать результат компонентам окна, как быть?
- Вопрос задан более трёх лет назад
- 567 просмотров
Комментировать
Решения вопроса 1Да, не можете. Метод может быть вызван только имея 2 указателя, указатель на объект и указатель на функцию, при этом тип метода содержит в себе тип объекта. Соответственно в C либе вы сможете сохранить только в 2 указателя, но вызвать из C метод вы не сможете.
Но можно сделать что-то типа
// C struct my_t < void (*send_sms)(int); void* context; >; void my_test(struct my_t *m) < (m->send_sms)(545, m->context); > // C++ void send_sms_helper(int value, void* context) < MainWindow *wnd = reinterpret_cast(context); wnd->test(value); > MainWindow::MainWindow(QWidget *parent). < my = my_new(); my->send_sms = send_sms_helper; my->context = this;
А send_sms_helper лучше сделать статическим в MainWindow.
Ответ написан более трёх лет назад
Нравится 1 1 комментарийLittleBuster @LittleBuster Автор вопроса
Спасибо большое!
Ответы на вопрос 1Станислав Макаров @Nipheris Куратор тега C++
Очень просто: чтобы поменьше влиять на остальной код на C++, который у вас уже написан, сделайте следующее:
1) заведите обычную функцию (НЕ член класса) send_sms, указатель на которую отдадите в либу;
2) сделайте в этой функции все, что необходимо по задаче (отправить смс? :));
3) реализуйте для MainWindow синглтон (проще) или сервис (правильнее), чтобы иметь возможность получить доступ из внешней функции send_sms к экземпляру окна;
4) у MainWindow дергайте метод test или любой другой, чтобы передать в него нужные данные. Если сделаете синглтон, будет что-то вроде этого: MainWindow::instance()->test(. );Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Ваш ответ на вопросВойдите, чтобы написать ответ
- Алгоритмы
- +2 ещё
Как правильно реализовать структуру данных для упаковки многомерного(кол-во измерений не известно сразу)массива в JSON / любой другой формат данных?
- 2 подписчика
- 6 часов назад
- 112 просмотров
Создание статической библиотеки
Библиотека – это пакет кода, который предназначен для повторного использования многими программами. Обычно библиотека C++ состоит из двух частей:
- заголовочный файл, который определяет функциональность, которую библиотека предоставляет (предлагает) программам, использующим ее;
- предварительно скомпилированный двоичный файл, который содержит реализацию этой функциональности, предварительно скомпилированную в машинный код.
Некоторые библиотеки могут быть разделены на несколько файлов и/или иметь несколько файлов заголовков.
Библиотеки предварительно скомпилированы по нескольким причинам:
- Во-первых, поскольку библиотеки меняются редко, их не нужно часто перекомпилировать. Было бы пустой тратой времени перекомпилировать библиотеку каждый раз, когда вы пишете программу, которая ее испол