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

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

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

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



http://www.cyberforum.ru/cpp-beginners/thread685820.html
Примерный код: Знаками "++-" и "-++" обозначен то,чего я хочу добиться, но является неправильным.

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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как подключить библиотеку во время работы программы? (C++):

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

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

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

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

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

11
Nishen
467 / 278 / 154
Регистрация: 26.02.2015
Сообщений: 1,319
Завершенные тесты: 2
28.07.2015, 18:13 #2
Мне кажется, что никак.
0
Croessmah
++Ͻ
14147 / 8072 / 1512
Регистрация: 27.09.2012
Сообщений: 19,907
Записей в блоге: 3
Завершенные тесты: 1
28.07.2015, 18:14 #3
А Вы вообще понимаете что такое именно библиотека? Что такое программа? Что такое препроцессор, компилятор, объектные файлы и т.д.? Вообще хоть что-нибудь?
0
Console_Love
0 / 0 / 1
Регистрация: 17.01.2015
Сообщений: 25
28.07.2015, 18:19  [ТС] #4
Цитата Сообщение от Croessmah Посмотреть сообщение
А Вы вообще понимаете что такое именно библиотека? Что такое программа? Что такое препроцессор, компилятор, объектные файлы и т.д.? Вообще хоть что-нибудь?
Конечно понимаю. Просто сложно объяснить то,что я создаю

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

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

Решение

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

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

Добавлено через 1 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение
Если Вам нужна подгрузка функционала из каких-то библиотек, то пишите "каркас" для своих плагинов.
Походу мне это и нужно. Спасибо!
0
Croessmah
++Ͻ
14147 / 8072 / 1512
Регистрация: 27.09.2012
Сообщений: 19,907
Записей в блоге: 3
Завершенные тесты: 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
++Ͻ
14147 / 8072 / 1512
Регистрация: 27.09.2012
Сообщений: 19,907
Записей в блоге: 3
Завершенные тесты: 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; ... при повторном...

Написать программу вычисления величины дохода по вкладу. Процентная ставка (% годовых) и время хранения (дней) задаются во время работы программы
1. Написать программу вычисления величины дохода по вкладу. Процентная ставка...

Как подключить библиотеку на с# к c++?
Доброго времени суток! Имею библиотеку https://discutils.codeplex.com/ на с#....


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

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

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