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

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

Войти
Регистрация
Восстановить пароль
 
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
06.05.2014, 12:41     Возможно ли подгрузить библиотеку так, чтоб компоновщик подгружал функции из основной программы? #1
Всем привет!

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

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

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

C++ Возможно ли так ?
C++ как сделать так, чтоб при работе программы можно было вводить в качестве данных русские слова?
C++ как сделать так, чтоб если вводишь не цифры, а буквы он не выкидывал из программы, а выполнял команду
C++ Возможно ли так?)
Нужна помощь в прописании основной функции C++
Работа с классом (как вызвать или обратится к классу из основной программы?) C++
Компоновщик о ликовка программы это одно и тоже? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2437 / 1609 / 235
Регистрация: 24.11.2012
Сообщений: 3,949
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
Модератор
Эксперт С++
 Аватар для Croessmah
12288 / 6975 / 784
Регистрация: 27.09.2012
Сообщений: 17,286
Записей в блоге: 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
2437 / 1609 / 235
Регистрация: 24.11.2012
Сообщений: 3,949
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
2437 / 1609 / 235
Регистрация: 24.11.2012
Сообщений: 3,949
06.05.2014, 14:44     Возможно ли подгрузить библиотеку так, чтоб компоновщик подгружал функции из основной программы? #12
В С++ статическая типизация и нет нормальной рефлексии, что тут добавить.
Yandex
Объявления
06.05.2014, 14:44     Возможно ли подгрузить библиотеку так, чтоб компоновщик подгружал функции из основной программы?
Ответ Создать тему
Опции темы

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