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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Собственный дистрибутив Qt.  (Прочитано 15698 раз)
mks56
Гость
« Ответ #15 : Октябрь 04, 2007, 10:12 »

To QCasper

Для эксперимента я у себя с помощью Winhex'а заменил букву диска с F на С, а также qt_libspath=F:\Qt\4.2.3\lib на qt_libspath=C:\Qt\4.2.3\liblib, и все нормально, qmake -v сработал с новым C:\Qt\4.2.3\liblib. Существенным здесь является, по-видимому, то, что если Вы производите замену посредством некоей своей программы, то 1. открывать файл нужно в бинарном режиме 2. нужно отследить общую длину блока между строками с тем, чтобы Ваш новый путь гарантированно заканчивался нулевым кодом. Проще всего эту процедуру сделать так: 1. открыть файл, определить его длину, захватить буфер этой длины, всосать в него файл целиком; 2. провести замены в буфере: 3. записать буфер в другой файл опять же в бинарном режиме. После этого у Вас должно все получиться. Успехов...
Записан
QCasper
Гость
« Ответ #16 : Октябрь 04, 2007, 10:29 »

To QCasper

Для эксперимента я у себя с помощью Winhex'а заменил букву диска с F на С, а также qt_libspath=F:\Qt\4.2.3\lib на qt_libspath=C:\Qt\4.2.3\liblib, и все нормально, qmake -v сработал с новым C:\Qt\4.2.3\liblib. Существенным здесь является, по-видимому, то, что если Вы производите замену посредством некоей своей программы, то 1. открывать файл нужно в бинарном режиме 2. нужно отследить общую длину блока между строками с тем, чтобы Ваш новый путь гарантированно заканчивался нулевым кодом. Проще всего эту процедуру сделать так: 1. открыть файл, определить его длину, захватить буфер этой длины, всосать в него файл целиком; 2. провести замены в буфере: 3. записать буфер в другой файл опять же в бинарном режиме. После этого у Вас должно все получиться. Успехов...

Угу, после того, как Вы подали идею с нулями в предыдущем посте мне сразу стало все понятно, я написал программу и сейчас, по-крайней мере на qmake -v, она выдает новый путь. Любопытно будет ли это работать в целом. А вообще за идею спасибо! Улыбающийся
Записан
vaprele07
Гость
« Ответ #17 : Октябрь 04, 2007, 10:49 »

Tonal, прав читай
http://doc.trolltech.com/4.1/qt-conf.html
заодно про environment
http://doc.trolltech.com/qtopia4.2/qmake-environment-reference.html

qt.conf бросается он в директорию с qmake
[paths]
Prefix=c:\MyQt
lib=c:\MyQt\lib
include=c:\MyQt\include
bin=c:\MyQt\bin
plugins=c:\MyQt\plugins
doc=c:\MyQt\doc
translations=c:\MyQt\translations

потом проверяешь:
qmake -query QT_INSTALL_PREFIX
Записан
QCasper
Гость
« Ответ #18 : Октябрь 05, 2007, 09:18 »


Читал.

qt.conf бросается он в директорию с qmake
[paths]
Prefix=c:\MyQt
lib=c:\MyQt\lib
include=c:\MyQt\include
bin=c:\MyQt\bin
plugins=c:\MyQt\plugins
doc=c:\MyQt\doc
translations=c:\MyQt\translations

потом проверяешь:
qmake -query QT_INSTALL_PREFIX

 Тем не менее тролли не используют этот подход при создании своих дистров, а тупо прошивают пути в код.


А с энвайронментом так вообще возни еще больше.

Записан
Tonal
Гость
« Ответ #19 : Октябрь 05, 2007, 13:05 »

Кстати, по хорошему патчеть надо не только qmake но и QtCore.
И скорее всего ещё moc, rcc, uic.
Записан
QCasper
Гость
« Ответ #20 : Октябрь 05, 2007, 15:20 »

Кстати, по хорошему патчеть надо не только qmake но и QtCore.
Согласен, я так и делаю.

И скорее всего ещё moc, rcc, uic.

Эти не нужно. По крайней мере тролли не патчат - раз, у меня без это патчинга работает - два.
Записан
QCasper
Гость
« Ответ #21 : Октябрь 05, 2007, 15:26 »

В принципе с тем патчером, который я написал, воспользовавшись идеей mks56, работает вроде как, но остается одна проблема, которую похоже никак нельзя решить. Причем тролли её тоже не решают.

Если я хочу заниматься отладкой, причем хочу заходить по step into в исходники Qt, я должен хранить исходники Qt именно по тому пути, по которому они лежали во время сборки дебаговых библиотек. Естественно эти пути в QtCored4.dll так просто пропатчить уже не удается, ибо после них нет такого огромного количества нулей.
« Последнее редактирование: Октябрь 05, 2007, 15:28 от QCasper » Записан
Tonal
Гость
« Ответ #22 : Октябрь 05, 2007, 16:10 »

Ну а за это уже отвечает компилятор, линкер и отладчик.
Отладчикам от MSVC и Borland можно сказать где реально находятся исходники.
Скорее всего в gdb тоже есть подобное.
Записан
QCasper
Гость
« Ответ #23 : Октябрь 05, 2007, 16:21 »

Ну а за это уже отвечает компилятор, линкер и отладчик.
Отладчикам от MSVC и Borland можно сказать где реально находятся исходники.
Скорее всего в gdb тоже есть подобное.

Интересно как...
Записан
ритт
Гость
« Ответ #24 : Октябрь 05, 2007, 23:20 »

> В принципе с тем патчером, который я написал

дай линку на патчер, если не жалко - будет полезно
Записан
QCasper
Гость
« Ответ #25 : Октябрь 06, 2007, 00:11 »

> В принципе с тем патчером, который я написал

дай линку на патчер, если не жалко - будет полезно

Не жалко Улыбающийся перед компиляцией c_Prefix нужно изменить на то значение, которое прошито в твой qmake (или QtCore(d)4.dll).

Код:
#include <qfile.h>
#include <iostream>
#include <qcoreapplication.h>

const char* c_Usage = "Usage: qtpatcher <file> <new prefix>";
const char* c_Prefix = "d:\\qt\\4.3.1-msvc";

const QList<QByteArray> pp = QList<QByteArray>()
<< QByteArray("qt_prfxpath=") + c_Prefix + QByteArray("")
<< QByteArray("qt_docspath=") + c_Prefix + QByteArray("\\doc")
<< QByteArray("qt_hdrspath=") + c_Prefix + QByteArray("\\include")
<< QByteArray("qt_libspath=") + c_Prefix + QByteArray("\\lib")
<< QByteArray("qt_binspath=") + c_Prefix + QByteArray("\\bin")
<< QByteArray("qt_plugpath=") + c_Prefix + QByteArray("\\plugins")
<< QByteArray("qt_datapath=") + c_Prefix + QByteArray("")
<< QByteArray("qt_trnspath=") + c_Prefix + QByteArray("\\translations")
<< QByteArray("qt_xmplpath=") + c_Prefix + QByteArray("\\examples")
<< QByteArray("qt_demopath=") + c_Prefix + QByteArray("\\demos")
;
int findNonZeroIndex(const QByteArray & ba, int from) {
while(ba[from++] == '\0');
return from - 1;
}

int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);

if (argc != 3) {
std::cout << c_Usage << std::endl;
return 0;
}

QFile qmake(argv[1]);
if (!qmake.open(QIODevice::ReadOnly)) {
std::cout << "Can't open " << argv[1] << " for reading" << std::endl;
return 0;
}

QByteArray ba = qmake.readAll();
qmake.close();

for (int i=0; i<pp.size(); i++) {
int l = findNonZeroIndex(ba, ba.indexOf(pp[i]) + pp[i].length()) - ba.indexOf(pp[i]);

QByteArray src = pp[i];
while((src += '\0').length() != l);
QByteArray dst = src;

dst.replace(c_Prefix, argv[2]);

if (dst.length() < l)
while((dst += '\0').length() != l);
else if (dst.length() > l)
dst.remove(l, dst.length()-l);

ba.replace(src, dst);
}

if (!qmake.open(QIODevice::WriteOnly)) {
std::cout << "Can't open " << argv[1] << " for writing" << std::endl;
return 0;
}

qmake.write(ba);
qmake.close();

return 0;
}

Код не идеален, проверок на переполнения буфера и прочую дребедень нет, но с 4.3.1 работает точно. Если qmake и QtCore(d)4.dll других версий собраны так же как и в этой версии (с кучей нолей после путей), то и с ними работать должен.
« Последнее редактирование: Октябрь 06, 2007, 00:13 от QCasper » Записан
QCasper
Гость
« Ответ #26 : Октябрь 08, 2007, 09:34 »

Ну а за это уже отвечает компилятор, линкер и отладчик.
Отладчикам от MSVC и Borland можно сказать где реально находятся исходники.
Скорее всего в gdb тоже есть подобное.


И всё же, как же это сделать? Меня интересует MSVC прежде всего. Я так полагаю одного того, что я прописал директорий с исходниками в VC++ Directories - мало (а то и вообще не нужно) ?
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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