Russian Qt Forum
Ноябрь 26, 2024, 12:44 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Компиляция файла ресурсов в разделяемую библиотеку  (Прочитано 7934 раз)
hamlo
Гость
« : Ноябрь 23, 2009, 09:14 »

Собсвенно сабж, госопода. Создаем pro фаил. Включаем опции TEMPLATE = lib TARGET = Resources DESTDIR = ./ RESOURCES += res.qrc. Собирается в в либу, все нормально. А теперь, внимательно, вопрос. Как данную либу подключать к моим проектам.

Что пробовал - писать в pro файлах -L/path/to/lib -lResources. Но, логично предположить, что h-файла при компиляции qrc нет, то и нет интерфейса для линковки. Если просто класть либу в директорию с бинарным исполняемым файлом, тоже толку 0 - хотя по идее, процесс должен обыскивать при запросе ресурса, все доступные по системной переменной PATH и в текущей директории (по крайней мере в С# так и можно написать класс, который временно изменяет порядок этого поиска, явно указывая файл, где искать ресурс).
Если жестко вкомпиливать ресурс в одну из разделяемых библиотек, то приложение его видит. Ну вот и не пойму я, каков механизм линковки файла ресурса и приложения. Объясните пожалуйста, да расскажите, как им правильно пользоваться.
« Последнее редактирование: Ноябрь 23, 2009, 09:20 от hamlo » Записан
Rcus
Гость
« Ответ #1 : Ноябрь 23, 2009, 09:24 »

и того что *.h файла нет значит интерфейс обеспечивается на более общем уровне. В частности для инициализации ресурсов иногда необходимо использовать Q_INIT_RESOURCE. Этот и другие способы указаны в "The Qt Resource System"
Записан
hamlo
Гость
« Ответ #2 : Ноябрь 23, 2009, 09:30 »

Цитировать
For example, if your application's resources are listed in a file called myapp.qrc, you can ensure that the resources are initialized at startup by adding this line to your main() function:

 Q_INIT_RESOURCE(myapp);

Не катит... тут он динамически подгружает прямо из qrc. Мне же надо, чтобы мое приложение, обращалось к динамической библиотеке. Если ест у кого пример реализации, киньте пожалуйста, да закроем тему.

ЗЫ Или я что то не понял в использовании Q_INIT_RESOURCE?

Цитировать
qmake will produce make rules to generate a file called qrc_application.cpp that is linked into the application. This file contains all the data for the images and other resources as static C++ arrays of compressed binary data. The qrc_application.cpp file is automatically regenerated whenever the .qrc file changes or one of the files that it refers to changes. If you don't use .pro files, you can either invoke rcc manually or add build rules to your build system.
Я так понимаю, динамическая линковка ресурсов из бинарного файла не возможна в принципе?
« Последнее редактирование: Ноябрь 23, 2009, 09:46 от hamlo » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Ноябрь 23, 2009, 09:56 »

hamlo, а зачем тебе загружать ресурсы динамически в виде одного бинарного файла? Может лучше сами ресурсы на ходу подгружать (картинки и т.п.)?
Записан

Юра.
hamlo
Гость
« Ответ #4 : Ноябрь 23, 2009, 10:12 »

У меня набор приложений, пользуется одним набором иконок. Очень удобно, использовать в таком случае 1 разделяемую библиотеку, особенно если иконок много, а не плодить копии одного и того же ресурса. Динамическая подгрузка ресурса прямо из картинки... ну и сколько придется учесть моментов контроля за доступностью ресурса, его формата хранения, размера, и прочее перед загрузкой, чтобы убедится, что пользователь увидит интерфейс, таким как задумывал разработчик?
Не... коли уже есть удобная система QResource, стоит ей воспользоваться и раздуть на пару метров бинарник каждого приложения... в противном случае костыль.

Если бы речь шла о создании какого нить фотоальбома и загрузке пару сотен фото или тысяч, то да - безусловно, динамическая загрузка из файла - наше все.

ЗЫ Последняя идея состоит в том, чтобы включать файл ресурсов в pro-файл, который содержит HEADERS += resourceinterface.h  SOURCE +=resourceinterface.cpp RESOURCE += resource.qrc. resourceinterface.h содержит класс с конструктором по-умолчанию.
Код:
#ifndef RESOURCEINTERFACE_H
#define RESOURCEINTERFACE_H
class ResourceInterface{
    public:
    ResourceInterface();
};
#endif //end RESOURCEINTERFACE_H
В cpp файле а-ля
Код:
#include "resourceinterface.h"
ResourceInterface::ResourceInterface(){
}
Далее заголовочник подключаем к проекту include "resourceinterface.h" а в pro файле добавляем INCLUDEPATH = /path/to/resourceinterface.h и указываем директирву LIBS+=L/path/to/lib -lResource. В коде основной программы создаем эксземпляр класса, котрый хранится в resourceinterface.h, и точка входа в библиотеку с ресурсами будет обозначена.
Код:
#include "resourceinterface.h"
...
ResourceInterface resIface;
...
При этом мы здоровски экономим память и место на винте. Но может кто придумает более красивое решение? А то, это на костыль больше похоже... =)
« Последнее редактирование: Ноябрь 23, 2009, 12:46 от hamlo » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #5 : Ноябрь 23, 2009, 12:56 »

Цитировать
У меня набор приложений, пользуется одним набором иконок. Очень удобно, использовать в таком случае 1 разделяемую библиотеку, особенно если иконок много, а не плодить копии одного и того же ресурса. Динамическая подгрузка ресурса прямо из картинки... ну и сколько придется учесть моментов контроля за доступностью ресурса, его формата хранения, размера, и прочее перед загрузкой, чтобы убедится, что пользователь увидит интерфейс, таким как задумывал разработчик?
Ну вроде как к примеру в *.nix для приложений KDE все иконки устанавливаются/хранятся в /usr/share/apps/icons (если не изменяет память). И не нужно плодить копий - а просто туда же все копировать и т.п. аналогично.
ЗЫ: или я опять не в тему? Улыбающийся

ЗЫЗЫ: хотя, если речь идет о большом кол-ве иконок (для кнопочек, других элементов GUI) - то наверное будет захламлено дисковое пространство при таком способе - и, может быть, действительно нужно вынести ресурсы в отдельную библиотеку?
« Последнее редактирование: Ноябрь 23, 2009, 13:03 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
hamlo
Гость
« Ответ #6 : Ноябрь 23, 2009, 15:07 »

ЗЫЗЫ: хотя, если речь идет о большом кол-ве иконок (для кнопочек, других элементов GUI) - то наверное будет захламлено дисковое пространство при таком способе - и, может быть, действительно нужно вынести ресурсы в отдельную библиотеку?

Ну хотя бы с этой точки зрения... у меня используется набор из более 1500 иконок. В общем, сделал пока, как написал. Все устраивает, все шурстит быстро и гладко. Тему можно закрывать.
« Последнее редактирование: Ноябрь 23, 2009, 15:09 от hamlo » Записан
Hordi
Гость
« Ответ #7 : Ноябрь 23, 2009, 18:57 »

Закрывать тему рановато... Сам копирую одинаковые ресурсы в каждую аппликуху...
Записан
Hordi
Гость
« Ответ #8 : Ноябрь 27, 2009, 13:01 »

Я делаю чуть не так - все иконки, которые используются разными проектами - компилятся в бинарный файл-ресурс

rcc -binary myresource.qrc -o myresource.rcc

затем этот ресурс просто подгружается через

QResource::registerResource("/path/to/myresource.rcc");
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.052 секунд. Запросов: 22.