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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Console_Love
0 / 0 / 0
Регистрация: 17.01.2015
Сообщений: 25
#1

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

28.07.2015, 18:12. Просмотров 356. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как подключить библиотеку во время работы программы? (C++):

Какую библиотеку нужно подключить для работы с динамическими массивами - C++
Подскажите, пожалуйста, какую библиотеку нужно подключить, чтобы это заработало: cli::array&lt;array&lt;int&gt;^&gt;^ Str = gcnew...

Как сократить время работы программы?! - C++
Нужно сократить время работы программы по вычислению чисел Фибоначчи: Вот мой код: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include...

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Nishen
347 / 185 / 70
Регистрация: 26.02.2015
Сообщений: 902
28.07.2015, 18:13 #2
Мне кажется, что никак.
0
Croessmah
Эксперт CЭксперт С++
13214 / 7486 / 842
Регистрация: 27.09.2012
Сообщений: 18,403
Записей в блоге: 3
Завершенные тесты: 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
347 / 185 / 70
Регистрация: 26.02.2015
Сообщений: 902
28.07.2015, 18:20 #5
Цитата Сообщение от Console_Love Посмотреть сообщение
Просто сложно объяснить то,что я создаю
Как ты создаешь то, что НЕ МОЖЕШЬ ОБЪЯСНИТЬ?
0
Croessmah
Эксперт CЭксперт С++
13214 / 7486 / 842
Регистрация: 27.09.2012
Сообщений: 18,403
Записей в блоге: 3
Завершенные тесты: 1
28.07.2015, 18:21 #6
Цитата Сообщение от Console_Love Посмотреть сообщение
Конечно понимаю.
ну значит Вы понимаете, что пытаетесь изменить скомпилированный код, впихнув в него текст, находящийся в включаемом файле посредством препроцессора? Только что бог рефлексии в гробу перевернулся.
Цитата Сообщение от Console_Love Посмотреть сообщение
Просто сложно объяснить то,что я создаю
Правильно заданный вопрос - это уже половина ответа, так что постарайтесь объяснить
0
Nishen
347 / 185 / 70
Регистрация: 26.02.2015
Сообщений: 902
28.07.2015, 18:24 #7
Смотри, что пишется в одном из учебников о директивах препроцессора:
"Директива препроцессора, напротив, является указанием компилятору. Пропроцессором называется специальная часть компилятора, обрабатывающая подобные директивы перед началом процесса компиляции кода".

Исходя из этого, можно предполагать, что задуманное не возможно. Если пользователь уже вводит данные в программу (название заголовочного файла), то данная программа уже откомпилирована, а, следовательно, работа препроцессора уже была закончена.
0
Croessmah
Эксперт CЭксперт С++
13214 / 7486 / 842
Регистрация: 27.09.2012
Сообщений: 18,403
Записей в блоге: 3
Завершенные тесты: 1
28.07.2015, 18:25 #8
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Если Вам нужна подгрузка функционала из каких-то библиотек, то пишите "каркас" для своих плагинов.
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
Эксперт CЭксперт С++
13214 / 7486 / 842
Регистрация: 27.09.2012
Сообщений: 18,403
Записей в блоге: 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
65 / 65 / 1
Регистрация: 29.11.2011
Сообщений: 300
28.07.2015, 18:53 #11
Пиши на питоне
0
Croessmah
Эксперт CЭксперт С++
13214 / 7486 / 842
Регистрация: 27.09.2012
Сообщений: 18,403
Записей в блоге: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.07.2015, 22:12
Привет! Вот еще темы с ответами:

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

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

Как подключить библиотеку? - C++
Скачал c boost.org архив с библиотекой boost скинул в папку @C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\\lib\boost@ пытаюсь...

А как подключить библиотеку в c++ ? - C++
А как подключить библиотеку в c++ ? К примеру для музыки или видео... :wall:


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
28.07.2015, 22:12
Ответ Создать тему
Опции темы

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