0 / 0 / 0
Регистрация: 17.01.2015
Сообщений: 25
1

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

28.07.2015, 18:12. Показов 3296. Ответов 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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.07.2015, 18:12
Ответы с готовыми решениями:

Подключить библиотеку по мере работы программы
начну с того что я хочу что бы программа могла мигрировать при помощи копирования одного файла exe....

Как вывести время работы программы ПОСЛЕ завершения работы progressBar?
У меня почему-то сначала выводится время в MessageBox, а затем уже завершает свою работу...

Подключить библиотеку для работы с Excel
помогите подключить библиотеку для работы с Excel

Какую библиотеку подключить для работы с файлами
Доброго Времени суток, объясните мне как работают функции и какую для них подключать библиотеку....

11
1172 / 833 / 359
Регистрация: 26.02.2015
Сообщений: 3,743
28.07.2015, 18:13 2
Мне кажется, что никак.
0
Don't worry, be happy
17768 / 10533 / 2034
Регистрация: 27.09.2012
Сообщений: 26,505
Записей в блоге: 1
28.07.2015, 18:14 3
А Вы вообще понимаете что такое именно библиотека? Что такое программа? Что такое препроцессор, компилятор, объектные файлы и т.д.? Вообще хоть что-нибудь?
0
0 / 0 / 0
Регистрация: 17.01.2015
Сообщений: 25
28.07.2015, 18:19  [ТС] 4
Цитата Сообщение от Croessmah Посмотреть сообщение
А Вы вообще понимаете что такое именно библиотека? Что такое программа? Что такое препроцессор, компилятор, объектные файлы и т.д.? Вообще хоть что-нибудь?
Конечно понимаю. Просто сложно объяснить то,что я создаю

Добавлено через 13 секунд
Вы думаете что я полный новичок в этом деле?
0
1172 / 833 / 359
Регистрация: 26.02.2015
Сообщений: 3,743
28.07.2015, 18:20 5
Цитата Сообщение от Console_Love Посмотреть сообщение
Просто сложно объяснить то,что я создаю
Как ты создаешь то, что НЕ МОЖЕШЬ ОБЪЯСНИТЬ?
0
Don't worry, be happy
17768 / 10533 / 2034
Регистрация: 27.09.2012
Сообщений: 26,505
Записей в блоге: 1
28.07.2015, 18:21 6
Цитата Сообщение от Console_Love Посмотреть сообщение
Конечно понимаю.
ну значит Вы понимаете, что пытаетесь изменить скомпилированный код, впихнув в него текст, находящийся в включаемом файле посредством препроцессора? Только что бог рефлексии в гробу перевернулся.
Цитата Сообщение от Console_Love Посмотреть сообщение
Просто сложно объяснить то,что я создаю
Правильно заданный вопрос - это уже половина ответа, так что постарайтесь объяснить
0
1172 / 833 / 359
Регистрация: 26.02.2015
Сообщений: 3,743
28.07.2015, 18:24 7
Смотри, что пишется в одном из учебников о директивах препроцессора:
"Директива препроцессора, напротив, является указанием компилятору. Пропроцессором называется специальная часть компилятора, обрабатывающая подобные директивы перед началом процесса компиляции кода".

Исходя из этого, можно предполагать, что задуманное не возможно. Если пользователь уже вводит данные в программу (название заголовочного файла), то данная программа уже откомпилирована, а, следовательно, работа препроцессора уже была закончена.
0
Don't worry, be happy
17768 / 10533 / 2034
Регистрация: 27.09.2012
Сообщений: 26,505
Записей в блоге: 1
28.07.2015, 18:25 8
Лучший ответ Сообщение было отмечено Console_Love как решение

Решение

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

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

Добавлено через 1 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение
Если Вам нужна подгрузка функционала из каких-то библиотек, то пишите "каркас" для своих плагинов.
Походу мне это и нужно. Спасибо!
0
Don't worry, be happy
17768 / 10533 / 2034
Регистрация: 27.09.2012
Сообщений: 26,505
Записей в блоге: 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
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
28.07.2015, 18:53 11
Пиши на питоне
0
Don't worry, be happy
17768 / 10533 / 2034
Регистрация: 27.09.2012
Сообщений: 26,505
Записей в блоге: 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.07.2015, 22:12
Помогаю со студенческими работами здесь

Какую библиотеку подключить для работы функции
В delphi есть функция FileSetReadOnly. Но lazarus ругается на нее. Какой unit подключить для работы...

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

Как сократить время работы программы?
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;...

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

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

Как проверять время работы программы?
Как можно проверять время работы программы на Python? Может есть какой-нибудь скрипт или программа?


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru