Подгрузка и пользвание библиотеки по надобности (Как вызвать функцию поздней бинтовки ?)

Модератор: Модераторы разделов

Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Подгрузка и пользвание библиотеки по надобности

Сообщение Женя Подсыпальников »

Здравствуйте ! :)

Пость имеется исходная пара некоторой библиотеки на экспорт:

Код: Выделить всё

// language_Common.h
#pragma once
#include <string>

bool /*тут, наверное, экспортное украшение нужно*/ GetGladeString(const std::string& strKey, std::string& strValue);
bool /*тут, наверное, экспортное украшение нужно*/ GetSingleString(const std::string& strKey, std::string& strValue);
typedef bool (/*тут, наверное, экспортное украшение нужно*/ *LOOKUP_PROC_PFN)(const std::string& strKey, std::string& strValue);

Код: Выделить всё

// language_RU.h
#pragma once
#include "language_Common.h"

Код: Выделить всё

// language_RU.cpp
#include "language_RU.h"

bool /*тут, наверное, экспортное украшение нужно*/ GetGladeString(const std::string& /*strKey*/, std::string& /*strValue*/) { return false; }
bool /*тут, наверное, экспортное украшение нужно*/ GetSingleString(const std::string& /*strKey*/, std::string& /*strValue*/) { return false; }

Вопрос 0:
Какое украшение необходимо функциям на экспорт ?

Вопрос 1:
Как должна выглядеть командная строка для строя динамической библиотеки "language_RU", экспортирующей обе функции ?

Далее, пусть имеется клиент библиотеки:

Код: Выделить всё

// test.cpp
#include "language_RU.h"

int main(int argc, char* argv[])
{
  LINUX_INSTANCE_HANDLE hLib(::linuxLoadLibrary("language_RU"));
  if (hLib) {
    LOOKUP_PROC_PFN pfnGetSingleString(::linuxGetProcAddress(hLib, "GetSingleString"));
    if (pfnGetSingleString) {
      const std::string strTestKey("flashTitle");
      std::string strTestValue;
      if ((*pfnGetSingleString)(strTestKey, strTestValue)) {
        // Поехали...
      }
    }
    ::linuxFreeLibrary(hLib);
  }
  return 0;
}


Вопрос 2:
Как это (код в test.cpp) пишется в Линуксе ? :blush:

Спасибо большое !
Пойдём на рыбалку !
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21351
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Подгрузка и пользвание библиотеки по надобности

Сообщение Bizdelnick »

gettext же.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: Подгрузка и пользвание библиотеки по надобности

Сообщение Женя Подсыпальников »

Да, но мне б не только текст,
позднее и дампы бинарные с нулями посерёдке... :)

О ! Последний вопрос отпадает :)

По первым двум - ХабраХабр советует применять следующую декларацию:

Код: Выделить всё

// Header
#ifdef __cplusplus
extern "C" {
#endif

void run(void);

#ifdef __cplusplus
}
#endif


Тогда такой вопрос:
возможны ли классовые ссылки в параметрах заключённых в скобки функций экспорту ?
Наверное, последний вопрос :)
Пойдём на рыбалку !
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21351
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Подгрузка и пользвание библиотеки по надобности

Сообщение Bizdelnick »

Женя Подсыпальни... писал(а):
24.01.2014 13:04
Да, но мне б не только текст,
позднее и дампы бинарные с нулями посерёдке...

ИМХО лучше придумать отдельный костыль для бинарных данных (а если их немного, то base64 в помощь), чем бегать по граблям с таким мегакостылём. Ну да дело Ваше, и лоб этими граблями будет разбиваться тоже Ваш.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: Подгрузка и пользвание библиотеки по надобности

Сообщение Женя Подсыпальников »

Bizdelnick писал(а):
24.01.2014 13:15
ИМХО лучше придумать отдельный костыль для бинарных данных

О том и речь, чуть-чуть осталось :)

(и что меня дёрнуло про текст писать...)
Пойдём на рыбалку !
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Подгрузка и пользвание библиотеки по надобности

Сообщение NickLion »

0+1. В принципе ничего особого не требуется:
b.h:

Код: Выделить всё

bool f(int a);
typedef bool (*f_t)(int a);

b.cpp:

Код: Выделить всё

#include "b.h"

bool f(int a) {
    return false;
}

Комилируем: g++ -shared -o libb.so b.cpp
Получаем libb.so.
Используем, a.cpp:

Код: Выделить всё

#include <iostream>
#include <dlfcn.h>
#include "b.h"


int main()
{
    void* lib = dlopen("./libb.so", RTLD_NOW);
    f_t ff = (f_t)dlsym(lib, "_Z1fi");
    if (ff) {
        std::cout << ff(5) << std::endl;
    }
    return 0;
}


Но здесь может появиться вопрос, что за страшное _Z1fi вместо f. Дело в том, что C++ добавляет информацию о типах. Если это не нравится, то добавьте extern "C", тогда функции будут экспортироваться по правилам языка Си, а не C++, и будет просто f. Вот так:

Код: Выделить всё

extern "C" bool f(int a) ...
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21351
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Подгрузка и пользвание библиотеки по надобности

Сообщение Bizdelnick »

Женя Подсыпальни... писал(а):
24.01.2014 13:24
О том и речь

Не, у Вас речь о мегакостыле с граблями.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Подгрузка и пользвание библиотеки по надобности

Сообщение NickLion »

Женя Подсыпальников писал(а):
24.01.2014 13:04
Тогда такой вопрос:
возможны ли классовые ссылки в параметрах заключённых в скобки функций экспорту ?

Да.
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Подгрузка и пользвание библиотеки по надобности

Сообщение serzh-z »

Рекомендую посмотреть на Glib.
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: Подгрузка и пользвание библиотеки по надобности

Сообщение Женя Подсыпальников »

Большое спасибо !

Код: Выделить всё

тогда функции будут экспортироваться по правилам языка Си, а не C++, и будет просто f. Вот так


Но тогда-сь, в параметре нельзя пользовать классовые типы, или можно, Вы не пробывали ? :)



Спасибо ! :)

Всё ! Радуюсь ! Иду смотреть на GLib , там, наверное, ещё более примеров :)
Пойдём на рыбалку !
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: Подгрузка и пользвание библиотеки по надобности

Сообщение Женя Подсыпальников »

Bizdelnick писал(а):
24.01.2014 13:33
Женя Подсыпальни... писал(а):
24.01.2014 13:24
О том и речь

Не, у Вас речь о мегакостыле с граблями.


Да, согласен :)
Обязательно прочту мануал по gettext , спасибо !
Пойдём на рыбалку !
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Подгрузка и пользвание библиотеки по надобности

Сообщение drBatty »

Женя Подсыпальни... писал(а):
24.01.2014 12:05
Какое украшение необходимо функциям на экспорт ?

никакого не нужно. И костыля с хабры не нужно.
Женя Подсыпальни... писал(а):
24.01.2014 13:04
Тогда такой вопрос:
возможны ли классовые ссылки в параметрах заключённых в скобки функций экспорту ?

не нужно.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: Подгрузка и пользвание библиотеки по надобности

Сообщение Женя Подсыпальников »

Если это не нравится

не нужно

Тоже так видится...
А если кому "хлеба с ларька" понадобится - просто выдать "талончик 245_Zi", и нормально :)
Пойдём на рыбалку !
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Подгрузка и пользвание библиотеки по надобности

Сообщение drBatty »

Женя Подсыпальни...
а зачем? Вам это Zfi на хлеб намазывать?
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: Подгрузка и пользвание библиотеки по надобности

Сообщение Женя Подсыпальников »

Bizdelnick писал(а):
24.01.2014 12:55
gettext же.

Ooo... Да ну его... Выглядит неэлегантно как-то...
А эти *.MO - юникодовы или пропэйджены, бинарны ли XML ? :)

drBatty писал(а):
24.01.2014 14:35
Женя Подсыпальни...
а зачем? Вам это Zfi на хлеб намазывать?

Нет конечно :)
Интересно, а по перестройке библиотеки - функция по-иному не "зашифруется" ?
Пойдём на рыбалку !
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21351
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Подгрузка и пользвание библиотеки по надобности

Сообщение Bizdelnick »

Женя Подсыпальни... писал(а):
24.01.2014 14:43
Выглядит неэлегантно как-то...

Неэлегантно выглядит то, что у Вас. А gettext - решение, сложность которого адекватна сложности решаемой задачи. Если Вам кажется, что можно сделать проще, значит, Вы чего-то не учитываете. Например добавление поддержки других языков, наличие разных форм множественного числа, организацию работы переводчиков, автоматизацию внесения изменений. Да, я знаю, Вы скажете, что это всё Вам сейчас не надо, но потом, когда (если) понадобится, переделывать или доделывать Ваш велосипед будет сложнее.

Женя Подсыпальни... писал(а):
24.01.2014 14:43
А эти *.MO - юникодовы или пропэйджены, бинарны ли XML ?

https://www.gnu.org/software/gettext/manual...e/MO-Files.html
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: Подгрузка и пользвание библиотеки по надобности

Сообщение Женя Подсыпальников »

Bizdelnick писал(а):
24.01.2014 14:49
организацию работы переводчиков

Дак я думал: в Glade-жешь им всё равно работать, пусть бы и строки там перевели, заодно. Не ?
Или грузить Glade-хозяйство один раз и переводить каждую радиокнопку динамически ?
Это ж сколько ходов добавится в исполнении, к этим *.МО :)

Не, в Glade им треба работать,
а представьте Себе: он где-то-сь там в *.МО перевёл,
а в гуе на длину его версии места не хватает...

А поскольку уж там - пусть и таблицы строк тоже там переведут,
в свеженьком визуальном контексте. Во. Не ? :)
Пойдём на рыбалку !
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Подгрузка и пользвание библиотеки по надобности

Сообщение NickLion »

Женя Подсыпальников писал(а):
24.01.2014 14:43
Интересно, а по перестройке библиотеки - функция по-иному не "зашифруется" ?

Это не шифровка, а name decoration или name mangling. Так есть вполне конкретные правила.
_Z — стандартный префикс
1 — длина имени функции
f — имя функции
i — аргумент типа int.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21351
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Подгрузка и пользвание библиотеки по надобности

Сообщение Bizdelnick »

Женя Подсыпальни... писал(а):
24.01.2014 14:55
Дак я думал: в Glade-жешь им всё равно работать, пусть бы и строки там перевели, заодно.

Жестоко.

Женя Подсыпальни... писал(а):
24.01.2014 14:55
Или грузить Glade-хозяйство один раз и переводить каждую радиокнопку динамически ?

Конечно.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Подгрузка и пользвание библиотеки по надобности

Сообщение drBatty »

Женя Подсыпальни... писал(а):
24.01.2014 14:43
Интересно, а по перестройке библиотеки - функция по-иному не "зашифруется" ?

зашифруется, если тип поменять. Это оно для того и нужно.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: Подгрузка и пользвание библиотеки по надобности

Сообщение Женя Подсыпальников »

Bizdelnick писал(а):
24.01.2014 15:33
Женя Подсыпальни... писал(а):
24.01.2014 14:55
Или грузить Glade-хозяйство один раз и переводить каждую радиокнопку динамически ?

Конечно.

Не ожидал такого вовсе, а тут - иначе... :)

А места если не хватит на кнопке - будет неэлегантно ж...

drBatty писал(а):
24.01.2014 15:37
Женя Подсыпальни... писал(а):
24.01.2014 14:43
Интересно, а по перестройке библиотеки - функция по-иному не "зашифруется" ?

зашифруется, если тип поменять. Это оно для того и нужно.

ОК, порядок в стопке декларации, наверное, тоже лучше не менять ?
Ой, там же ж имя тоже в шифровке. ОК.

Код: Выделить всё

Это не шифровка, а name decoration или name mangling. Так есть вполне конкретные правила.
_Z — стандартный префикс
1 — длина имени функции
f — имя функции
i — аргумент типа int.

Большое спасибо, всё понятно :)
Пойдём на рыбалку !
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21351
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Подгрузка и пользвание библиотеки по надобности

Сообщение Bizdelnick »

Женя Подсыпальни... писал(а):
24.01.2014 15:49
Не ожидал такого вовсе, а тут - иначе...

Ваши познания о Glade, простите, исключительно на Википедии базируются? В Glade изначально есть поддержка gettext, весь Gnome им пользуется. Про свойство translatable не слышали?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: Подгрузка и пользвание библиотеки по надобности

Сообщение Женя Подсыпальников »

Bizdelnick писал(а):
24.01.2014 16:08
Женя Подсыпальни... писал(а):
24.01.2014 15:49
Не ожидал такого вовсе, а тут - иначе...

Ваши познания о Glade, простите, исключительно на Википедии базируются? В Glade изначально есть поддержка gettext, весь Gnome им пользуется. Про свойство translatable не слышали?

Да, пока это такая база моя. Спасибо, не знал.

Опасное свойство, однако:
когда и кто увидит неэлегантность нехватки места на кнопке вычерпаному из недр МО тексту в исполнении ?..

Буду читать и думать, спасибо !
Пойдём на рыбалку !
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21351
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Подгрузка и пользвание библиотеки по надобности

Сообщение Bizdelnick »

Женя Подсыпальни... писал(а):
24.01.2014 16:12
когда и кто увидит неэлегантность нехватки места на кнопке вычерпаному из недр МО тексту в исполнении ?..

Тестировать надо. Вообще в местах, где такое возможно, но не очевидно, нужно комментарии для переводчиков вставлять. Вот только не знаю, как они в синтаксисе Glade должны выглядеть, по идее - обычный xmlный комментарий непосредственно перед переводимым полем.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: Подгрузка и пользвание библиотеки по надобности

Сообщение Женя Подсыпальников »

Дак а что-то он static const char* возвращаеть, этот gettext ...

Это что-ж получается,
я на "русской учётной записи" немецких "öäüß" не смогу увидеть ?

Или тороплюсь снова ? :)
Пойдём на рыбалку !
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21351
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Подгрузка и пользвание библиотеки по надобности

Сообщение Bizdelnick »

Женя Подсыпальни... писал(а):
24.01.2014 17:26
Или тороплюсь снова ?

Ага.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: Подгрузка и пользвание библиотеки по надобности

Сообщение Женя Подсыпальников »

Bizdelnick писал(а):
24.01.2014 16:08
В Glade изначально есть поддержка gettext, весь Gnome им пользуется. Про свойство translatable не слышали?

Понял как генерить РО-файл, передавая СРР-файлы в xgettext.
Наверное, эта утилита ищит вноски gettext("...").

А каким макаром загнать Glade-вноски в РО-файл - неужели лишь вручную в редакторе ?

Как обычно, нашёл потом.

Всё, умолкаю :)
Пойдём на рыбалку !
Спасибо сказали: