Форум программистов, компьютерный форум CyberForum.ru

Как подключить библиотеку во время работы программы? - C++

Восстановить пароль Регистрация
Другие темы раздела
Visual C++ MFC SetFocus() VK_UP VK_DOWN http://www.cyberforum.ru/cpp-beginners/thread1506296.html
Добрый день, уважаемые форумчане. Имеется инициализированный массив элементов CEdit: CEdit** pEdit; Ниже показана функция обработки нажатия клавиш. В ней сначала проверяется, является ли элемент, на котором сейчас стоит фокус, элементом массива pEdit. Если является, то координаты элемента сохраняются в переменных x и y. Дальше идет обработка нажатия клавиш стрелок... При нажатии стрелок ВЛЕВО...
C++ Ввод без ожидания стандартными средствами Здравствуйте. Делаю консольный тетрис в образовательных целях. Необходимо сделать ввод, чтобы я мог управлять падающей фигурой, но тут я столкнулся с проблемой: std::cin ждет, пока я введу данные и нажму Enter, мне же необходимо, чтобы ввод не останавливал программу и был невидим. Поискал по форуму, многие предлагают getch(), но getch() хоть и не требует нажатия Enter, все равно приостанавливает... http://www.cyberforum.ru/cpp-beginners/thread1506260.html
C++ Нажатие клавиши
Здравствуйте дорогие друзья, Я начинающий программист и хотел бы задать такой вопрос: Как сделать так, чтобы при нажатии на клавишу, происходила определённая функция) Вот пример кода:#include <iostream> using namespace std; int main(){ return 0; }
C++ Почему не показывается количество единиц при компиляции? в числе 017 их 4(1111)
#pragma hdrstop #include <stdio.h> #include <conio.h> int bit(unsigned int n) { int b; for(b=0; n!=0; n>>1) if (n%01) b++;
C++ Случайные числа http://www.cyberforum.ru/cpp-beginners/thread1506222.html
Доброго времени суток! Возможно ли сделать так, чтобы выпадали в случайном порядке числа 0, 2, 6, 8?
C++ Не могу убрать ошибку: "error LNK2001: неразрешенный внешний символ" здравствуйте весь интернет уже облазил , ни где похожего найти не могу . overview.obj : error LNK2001: неразрешенный внешний символ ""public: virtual void __thiscall vgui::Panel::OnKeyTyped(wchar_t)" (?OnKeyTyped@Panel@vgui@@UAEX_W@Z)" 1>overview.obj : error LNK2001: неразрешенный внешний символ ""public: virtual class vgui::Panel * __thiscall vgui::Panel::HasHotkey(wchar_t)"... подробнее

Показать сообщение отдельно
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
12085 / 6946 / 782
Регистрация: 27.09.2012
Сообщений: 17,230
Записей в блоге: 2
Завершенные тесты: 1
28.07.2015, 22:12     Как подключить библиотеку во время работы программы?
Накидал примитивный примерчик под Linux'ом:
lib_1.cpp
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
 
extern "C"
{
    void starter () 
    {
        std::cout << "library one" << std::endl ;
    }   
}

lib_2.cpp
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
 
extern "C"
{
    void starter () 
    {
        std::cout << "library two" << std::endl ;
    }   
}

main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
#include <string>
#include <dlfcn.h>
 
 
using StarterFunction = void(*)() ;
 
 
int main()
{
    static_assert ( sizeof(void*) == sizeof(StarterFunction) , "sizes void* and StarterFunction must equal" ) ;
    StarterFunction funcStarter;
    void * handleLib = nullptr ;
    char * error ;
    std::string nameLib ;
    while ( true )
    {
        std::cout << "input library name ->" ;
        std::getline ( std::cin , nameLib ) ;
        if ( nameLib.size() == 0 )
        {
            break ;
        } 
        handleLib = dlopen ( nameLib.c_str() , RTLD_LAZY ) ;
        if ( handleLib == nullptr )
        {
            std::cerr << "Library \"" << nameLib << "\" load failed\n" ;
            error = dlerror() ;
            if ( error != nullptr ) {
                std::cerr << error << std::endl ;
            }
            continue ;
        }
 
        dlerror() ;
 
        *(void **) (&funcStarter) = dlsym( handleLib , "starter" ) ;
        error = dlerror() ;
        if ( error != nullptr ) {
            std::cerr << error << std::endl ;
            dlclose ( handleLib ) ;
            continue ;
        }
        funcStarter() ;
        dlclose ( handleLib ) ;
    }
}

Makefile
Код
all: program lib1.so lib2.so
lib1.so: lib_1.cpp
	g++ -o lib1.so -fpic -shared lib_1.cpp
lib2.so: lib_2.cpp
	g++ -o lib2.so -fpic -shared lib_2.cpp
program: main.cpp
	g++ -o main -std=c++11 -pedantic-errors main.cpp -ldl

результат
 
Текущее время: 15:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru