Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Console_Love
0 / 0 / 0
Регистрация: 17.01.2015
Сообщений: 25
1

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

28.07.2015, 18:12. Просмотров 1023. Ответов 11
Метки нет (Все метки)

Представьте ситуацию: Я прошу у пользователя ввести имя библиотеки, которая находится в одной папке с программой (библиотек может быть несколько). После того как он ввел к примеру "london.h", как ее подключить если препроцессор подключает их сначала? Библиотек может быть сколько угодно и пользователь может набрать что хочет. Если не понятно объяснил, напишите то,что непонятно.



Примерный код: Знаками "++-" и "-++" обозначен то,чего я хочу добиться, но является неправильным.

C++
1
2
3
4
5
6
7
8
#include <iostream>
using namespace std;
 
int main(){
    char library[20];
    cout<<"Введите библиотеку которую хотите подключить: "; cin>>library;
    ++- #include <library>--+
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.07.2015, 18:12
Ответы с готовыми решениями:

Какую библиотеку нужно подключить для работы с динамическими массивами
Подскажите, пожалуйста, какую библиотеку нужно подключить, чтобы это...

Как уменьшить время работы программы?
#include&lt;iostream&gt; using namespace std; int main() { int a,m,n; ...

Как сократить время работы программы?!
Нужно сократить время работы программы по вычислению чисел Фибоначчи: Вот мой...

Как влияет потоковый вывод на время работы программы?
Доброго времени суток! Есть код который решает задачку про Ханойские башни....

Как записать адрес в указатель во время работы программы
Нужно чтобы пользователь ввел адрес в сам указатель: int *ptr; cin &gt;&gt;...

11
Nishen
527 / 334 / 177
Регистрация: 26.02.2015
Сообщений: 1,580
Завершенные тесты: 3
28.07.2015, 18:13 2
Мне кажется, что никак.
0
Croessmah
++Ͻ
14740 / 8422 / 1597
Регистрация: 27.09.2012
Сообщений: 20,714
Записей в блоге: 2
Завершенные тесты: 1
28.07.2015, 18:14 3
А Вы вообще понимаете что такое именно библиотека? Что такое программа? Что такое препроцессор, компилятор, объектные файлы и т.д.? Вообще хоть что-нибудь?
0
Console_Love
0 / 0 / 0
Регистрация: 17.01.2015
Сообщений: 25
28.07.2015, 18:19  [ТС] 4
Цитата Сообщение от Croessmah Посмотреть сообщение
А Вы вообще понимаете что такое именно библиотека? Что такое программа? Что такое препроцессор, компилятор, объектные файлы и т.д.? Вообще хоть что-нибудь?
Конечно понимаю. Просто сложно объяснить то,что я создаю

Добавлено через 13 секунд
Вы думаете что я полный новичок в этом деле?
0
Nishen
527 / 334 / 177
Регистрация: 26.02.2015
Сообщений: 1,580
Завершенные тесты: 3
28.07.2015, 18:20 5
Цитата Сообщение от Console_Love Посмотреть сообщение
Просто сложно объяснить то,что я создаю
Как ты создаешь то, что НЕ МОЖЕШЬ ОБЪЯСНИТЬ?
0
Croessmah
++Ͻ
14740 / 8422 / 1597
Регистрация: 27.09.2012
Сообщений: 20,714
Записей в блоге: 2
Завершенные тесты: 1
28.07.2015, 18:21 6
Цитата Сообщение от Console_Love Посмотреть сообщение
Конечно понимаю.
ну значит Вы понимаете, что пытаетесь изменить скомпилированный код, впихнув в него текст, находящийся в включаемом файле посредством препроцессора? Только что бог рефлексии в гробу перевернулся.
Цитата Сообщение от Console_Love Посмотреть сообщение
Просто сложно объяснить то,что я создаю
Правильно заданный вопрос - это уже половина ответа, так что постарайтесь объяснить
0
Nishen
527 / 334 / 177
Регистрация: 26.02.2015
Сообщений: 1,580
Завершенные тесты: 3
28.07.2015, 18:24 7
Смотри, что пишется в одном из учебников о директивах препроцессора:
"Директива препроцессора, напротив, является указанием компилятору. Пропроцессором называется специальная часть компилятора, обрабатывающая подобные директивы перед началом процесса компиляции кода".

Исходя из этого, можно предполагать, что задуманное не возможно. Если пользователь уже вводит данные в программу (название заголовочного файла), то данная программа уже откомпилирована, а, следовательно, работа препроцессора уже была закончена.
0
Croessmah
++Ͻ
14740 / 8422 / 1597
Регистрация: 27.09.2012
Сообщений: 20,714
Записей в блоге: 2
Завершенные тесты: 1
28.07.2015, 18:25 8
Лучший ответ Сообщение было отмечено Console_Love как решение

Решение

Если Вам нужна подгрузка функционала из каких-то библиотек, то пишите "каркас" для своих плагинов.
http://www.cyberforum.ru/cpp-experts/thread123914.html
1
Console_Love
0 / 0 / 0
Регистрация: 17.01.2015
Сообщений: 25
28.07.2015, 18:33  [ТС] 9
Программа схожа с ОС , но не имеет ядра,ни загрузчика. Я хочу сделать так чтобы пользователь мог запускать свои программы написанные на С++ в header-е. Просто в своей программе вместо main он вместит функцию запуска программы для моей "псевдо-ОС" (например функция Starter). После этого моя программа (не буду называть ее ОС, она очень далеко от нее) сможет ее запустить. А здесь проблема. Чтобы использовать его хеадер, я должен его подключить.

Добавлено через 5 минут
Цитата Сообщение от Croessmah Посмотреть сообщение
Правильно заданный вопрос - это уже половина ответа, так что постарайтесь объяснить
Надеюсь теперь более понятнее

Добавлено через 1 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение
Если Вам нужна подгрузка функционала из каких-то библиотек, то пишите "каркас" для своих плагинов.
Походу мне это и нужно. Спасибо!
0
Croessmah
++Ͻ
14740 / 8422 / 1597
Регистрация: 27.09.2012
Сообщений: 20,714
Записей в блоге: 2
Завершенные тесты: 1
28.07.2015, 18:40 10
Цитата Сообщение от Console_Love Посмотреть сообщение
Я хочу сделать так чтобы пользователь мог запускать свои программы написанные на С++ в header-е.
header - это максимум исходник в тестовом виде.
Нужен будет как минимум интерпретатор в таком случае.

Цитата Сообщение от Console_Love Посмотреть сообщение
Просто в своей программе вместо main он вместит функцию запуска программы для моей "псевдо-ОС" (например функция Starter).
ну так пусть пишет свою программу, делает там функцию
C++
1
2
3
4
5
6
7
8
9
#ifdef __cplusplus
extern "C" {
#endif
 
void Starter() ; //Реализация тоже нужна, конечно же
 
#ifdef __cplusplus
}
#endif
потом собирает всё это дело в динамическую библиотеку (DLL/SO) и к Вам в папку.

Цитата Сообщение от Console_Love Посмотреть сообщение
После этого моя программа (не буду называть ее ОС, она очень далеко от нее) сможет ее запустить.
Ваша программа запрашивает имя динамической библиотеки у пользователя, загружает эту библиоткеу (LoadLibrary/dlopen), и дергает из этой библиотеки функцию Starter
1
Praktolock
71 / 71 / 18
Регистрация: 29.11.2011
Сообщений: 345
28.07.2015, 18:53 11
Пиши на питоне
0
Croessmah
++Ͻ
14740 / 8422 / 1597
Регистрация: 27.09.2012
Сообщений: 20,714
Записей в блоге: 2
Завершенные тесты: 1
28.07.2015, 22:12 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

результат
1
28.07.2015, 22:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.07.2015, 22:12

Как измерить время работы программы по сортировке массива?
Общая схема программы Х выглядит следующим образом. а. Выбрать очередной...

как узнать время работы программы решения алгоритма
Добрый вечер! Подскажите, пожалуйста, как сделать так, чтобы программа...

подскажите, как можно сохранить переменную, вводимую во время работы программы после ее закрытия
допустим есть переменная a ... int a; cin&gt;&gt;a; ... при повторном...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru