Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/21: Рейтинг темы: голосов - 21, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 17.01.2015
Сообщений: 25

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

28.07.2015, 18:12. Показов 4803. Ответов 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)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.07.2015, 18:12
Ответы с готовыми решениями:

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

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

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

11
 Аватар для Nishen
1357 / 856 / 365
Регистрация: 26.02.2015
Сообщений: 3,814
28.07.2015, 18:13
Мне кажется, что никак.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
28.07.2015, 18:14
А Вы вообще понимаете что такое именно библиотека? Что такое программа? Что такое препроцессор, компилятор, объектные файлы и т.д.? Вообще хоть что-нибудь?
0
0 / 0 / 0
Регистрация: 17.01.2015
Сообщений: 25
28.07.2015, 18:19  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
А Вы вообще понимаете что такое именно библиотека? Что такое программа? Что такое препроцессор, компилятор, объектные файлы и т.д.? Вообще хоть что-нибудь?
Конечно понимаю. Просто сложно объяснить то,что я создаю

Добавлено через 13 секунд
Вы думаете что я полный новичок в этом деле?
0
 Аватар для Nishen
1357 / 856 / 365
Регистрация: 26.02.2015
Сообщений: 3,814
28.07.2015, 18:20
Цитата Сообщение от Console_Love Посмотреть сообщение
Просто сложно объяснить то,что я создаю
Как ты создаешь то, что НЕ МОЖЕШЬ ОБЪЯСНИТЬ?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
28.07.2015, 18:21
Цитата Сообщение от Console_Love Посмотреть сообщение
Конечно понимаю.
ну значит Вы понимаете, что пытаетесь изменить скомпилированный код, впихнув в него текст, находящийся в включаемом файле посредством препроцессора? Только что бог рефлексии в гробу перевернулся.
Цитата Сообщение от Console_Love Посмотреть сообщение
Просто сложно объяснить то,что я создаю
Правильно заданный вопрос - это уже половина ответа, так что постарайтесь объяснить
0
 Аватар для Nishen
1357 / 856 / 365
Регистрация: 26.02.2015
Сообщений: 3,814
28.07.2015, 18:24
Смотри, что пишется в одном из учебников о директивах препроцессора:
"Директива препроцессора, напротив, является указанием компилятору. Пропроцессором называется специальная часть компилятора, обрабатывающая подобные директивы перед началом процесса компиляции кода".

Исходя из этого, можно предполагать, что задуманное не возможно. Если пользователь уже вводит данные в программу (название заголовочного файла), то данная программа уже откомпилирована, а, следовательно, работа препроцессора уже была закончена.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
28.07.2015, 18:25
Лучший ответ Сообщение было отмечено Console_Love как решение

Решение

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

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

Добавлено через 1 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение
Если Вам нужна подгрузка функционала из каких-то библиотек, то пишите "каркас" для своих плагинов.
Походу мне это и нужно. Спасибо!
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
28.07.2015, 18:40
Цитата Сообщение от 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
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
28.07.2015, 18:53
Пиши на питоне
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 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
Code
1
2
3
4
5
6
7
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.07.2015, 22:12
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru