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

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

Войти
Регистрация
Восстановить пароль
 
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
#1

Возможно ли подгрузить библиотеку так, чтоб компоновщик подгружал функции из основной программы? - C++

06.05.2014, 12:41. Просмотров 328. Ответов 11
Метки нет (Все метки)

Всем привет!

Хотелось бы узнать, возможно ли подгрузить библиотеку так, чтоб компоновщик подгружал функции из основной программы?

Допустим есть класс A, который собирается в основной программе.
Основная программа подгружает динамическую библиотеку, создаёт объект класса A, и передаёт в метод который объявлен в библиотеке указатель на данный объект.

Библиотека же не сможет вызывать методы данного объекта, если они небыли объявлены как виртуальные. Возможно ли сделать так, чтоб это стало возможным?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.05.2014, 12:41     Возможно ли подгрузить библиотеку так, чтоб компоновщик подгружал функции из основной программы?
Посмотрите здесь:

C++ Возможно ли так ?
C++ как сделать так, чтоб при работе программы можно было вводить в качестве данных русские слова?
C++ как сделать так, чтоб если вводишь не цифры, а буквы он не выкидывал из программы, а выполнял команду
C++ Возможно ли так?)
Нужна помощь в прописании основной функции C++
Работа с классом (как вызвать или обратится к классу из основной программы?) C++
Компоновщик о ликовка программы это одно и тоже? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2456 / 1628 / 238
Регистрация: 24.11.2012
Сообщений: 4,003
06.05.2014, 12:47     Возможно ли подгрузить библиотеку так, чтоб компоновщик подгружал функции из основной программы? #2
Для того, чтобы обратиться к атрибутам сущности в сборке (пусть, к методам класса в библиотеке), нужно, чтобы в этой сборке был как минимум доступен интерфейс класса. Ну это капитанство.

Ближе к теме: зависимость библиотеки от программы - нелогичное решение. Не надо так.
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
06.05.2014, 12:58  [ТС]     Возможно ли подгрузить библиотеку так, чтоб компоновщик подгружал функции из основной программы? #3
Ближе к теме: зависимость библиотеки от программы - нелогичное решение. Не надо так.
А как тогда устроить систему плагинов? Допустим есть приложением, есть библиотека - модуль.
Приложение подгружает модули, передавая указатель на некий объект, который предоставляет контроль над приложением.

Допустим у нас есть интерфейс:
C++
1
2
3
4
class ILogger
{
    virtual void log( const char *msg );
};
Например у нас есть приложение:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Logger : public ILogger
{
    void log( const char *msg ) override
    {
        std::cout << msg;
    }
};
 
int main()
{
    ILogger *logger = new Logger;
 
    dlopen( module );
    initModule  = dlsym( "initModule" );
    initModule( logger );
 
    return 0;
}
Модуль:

C++
1
2
3
4
5
6
bool initModule( ILogger *logger )
{
    logger->log( "hi" );
 
    return true;
}
Ну это отвечая на Ваш вопрос, а вообще просто интересно можно ли сделать так, чтоб компоновщик искал не только в самой библиотеке, а ссылался на основное приложение?
newbie666
Заблокирован
06.05.2014, 13:01     Возможно ли подгрузить библиотеку так, чтоб компоновщик подгружал функции из основной программы? #4
Цитата Сообщение от kvadro Посмотреть сообщение
Библиотека же не сможет вызывать методы данного объекта, если они небыли объявлены как виртуальные
с чего это не сможет? Если ты передаёшь в библиотечную функцию экземпляр какого - то класса, то почему библиотеку не сможет с ним работать? Сможет конечно. Как ты класс в библиотеку передаешь?
Croessmah
Модератор
Эксперт CЭксперт С++
12878 / 7264 / 810
Регистрация: 27.09.2012
Сообщений: 17,952
Записей в блоге: 2
Завершенные тесты: 1
06.05.2014, 13:02     Возможно ли подгрузить библиотеку так, чтоб компоновщик подгружал функции из основной программы? #5
Цитата Сообщение от kvadro Посмотреть сообщение
А как тогда устроить систему плагинов
http://www.cyberforum.ru/cpp-experts/thread123914.html
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
06.05.2014, 13:07  [ТС]     Возможно ли подгрузить библиотеку так, чтоб компоновщик подгружал функции из основной программы? #6
с чего это не сможет? Если ты передаёшь в библиотечную функцию экземпляр какого - то класса, то почему библиотеку не сможет с ним работать? Сможет конечно. Как ты класс в библиотеку передаешь?
Ну со свойствами сможет, ибо у нас будет указатель на объект, но вот с методами нет, ибо методы должны быть описаны в самой библиотеке.

Добавлено через 1 минуту
По идеи даже не соберётся.
newbie666
Заблокирован
06.05.2014, 13:14     Возможно ли подгрузить библиотеку так, чтоб компоновщик подгружал функции из основной программы? #7
Цитата Сообщение от kvadro Посмотреть сообщение
ибо методы должны быть описаны в самой библиотеке.
по этому я и спрашиваю, как ты в библиотечную функцию передаёшь экземпляр класса, если так:
void DLL_FUNC(MySuperClass *msc); - то значит, твоя dll-ка уже знает об этом классе (в dll-ке должен быть инклюдник с этим классом), а если так: void DLL_FUNC(void *HZ_CHTO_TAM) - тогда да, работать не сможешь
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
06.05.2014, 13:26  [ТС]     Возможно ли подгрузить библиотеку так, чтоб компоновщик подгружал функции из основной программы? #8
то значит, твоя dll-ка уже знает об этом классе
Она будет знать то, что ей покажут. А значит:

C++
1
2
3
4
5
6
7
8
9
10
11
class A
{
   void hello()
   {
      // ...
   }
 
   void hello2();
 
   int a;
};

То работать она сможет только с методом hello() и со свойством a. Метод void hello2(); будет для неё как Undefined symbols
newbie666
Заблокирован
06.05.2014, 13:59     Возможно ли подгрузить библиотеку так, чтоб компоновщик подгружал функции из основной программы? #9
Цитата Сообщение от kvadro Посмотреть сообщение
Метод void hello2(); будет для неё как Undefined symbols
ну с чего ты взял? Сделай инклюд хедера своего класса в DLL и будет она всё знать
0x10
2456 / 1628 / 238
Регистрация: 24.11.2012
Сообщений: 4,003
06.05.2014, 14:12     Возможно ли подгрузить библиотеку так, чтоб компоновщик подгружал функции из основной программы? #10
Взаимодействие через интерфейсы - нормальный вариант. И пример в третьем посте вполне работоспособный (после доведения до компилируемого состояния).
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
06.05.2014, 14:37  [ТС]     Возможно ли подгрузить библиотеку так, чтоб компоновщик подгружал функции из основной программы? #11
ну с чего ты взял? Сделай инклюд хедера своего класса в DLL и будет она всё знать
О чём знать? Он будет знать что в данном классе есть метод hello2, но это только прототип, откуда брать реализацию он не будет знать.

Взаимодействие через интерфейсы - нормальный вариант.
Он нормальный, но порождает множество интерфейсов. Из поста 3, наверняка, если бы мы разрабатывали модульную систему, то передавали бы не сам логгер, а некий API:

C++
1
2
3
4
5
6
7
class IApp
{
    virtual ILogger *logger();
    // ...
    // доступ к другим интерфейсам
    // ...
};
В итоге минусы:
- Множество интерфейсов
- Отсутствие возможности доступа к свойствам объекта.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.05.2014, 14:44     Возможно ли подгрузить библиотеку так, чтоб компоновщик подгружал функции из основной программы?
Еще ссылки по теме:

Как сделать так чтоб работало? Что с компилятором? C++
Отсортировать все строки методом быстрой сортировки так, чтоб элементы в них располагались по возрастанию C++
Как сделать так , чтоб возвращались первоначальные значения массива, перед работой с функцией C++
C++ Переставить строки в массиве так, чтоб они шли по возрастанию их сумм
C++ Не могу определить так, чтоб если массив, присвоить нулями

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

Или воспользуйтесь поиском по форуму:
0x10
2456 / 1628 / 238
Регистрация: 24.11.2012
Сообщений: 4,003
06.05.2014, 14:44     Возможно ли подгрузить библиотеку так, чтоб компоновщик подгружал функции из основной программы? #12
В С++ статическая типизация и нет нормальной рефлексии, что тут добавить.
Yandex
Объявления
06.05.2014, 14:44     Возможно ли подгрузить библиотеку так, чтоб компоновщик подгружал функции из основной программы?
Ответ Создать тему
Опции темы

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