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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Файлы *.pri; *.prf; *.prl  (Прочитано 10836 раз)
TaIRou
Гость
« : Июль 21, 2011, 23:04 »

Ребят, доброго времени суток.
Где можно почитать о функциональности данных файлов и какую общую нагрузку они на себе несут и когда стоит их самому создавать и использовать? В документации к Qt проскакивает информация по файлам *.prf, но в том контексте, в котором они используются (подключение через переменную CONFIG), мне невдомек тогда, а зачем файлы *.pri (подключение через функцию include()). К тому же есть еще файлы *.prl...
Записан
Igore
Гость
« Ответ #1 : Июль 22, 2011, 15:43 »

Могу сказать только про *.pri, используют этот файл для перечисления *.h и *.cpp в проекте, include(*.pri) просто добавляет все что в файле в pro файл. Можно взять студийный проект и создайть pro + pri через addIn, и поизучать их.
Записан
TaIRou
Гость
« Ответ #2 : Июль 22, 2011, 18:47 »

Пытаюсь использовать переменную qmake PWD
Цитировать
This variable contains the full path leading to the directory where the qmake project file (project.pro) is located.
Но столкнулся вот с такой ситуацией:

структура каталогов проекта:
Код:
root
│  
└───source
    │   work.pri
    │  
    └───work
            work.pro

work.pri:
Код:
!build_pass:message(work.pri -- $$PWD)

work.pro:
Код:
include(../work.pri)
!build_pass:message(work.pro -- $$PWD)

qmake выдает:
Цитировать
Project MESSAGE: work.pri -- D:/projects/root/source
Project MESSAGE: work.pro -- D:/projects/root/source/work

Но я то думал, что после включения work.pri в work.pro, содержимое PWD в вызове функции message будет идентичным в обоих случаях.

функция include:
Цитировать
Включает содержимое файла с заданным именем filename в текущий проект в точку, где происходит включение. Эта функция выполняется если filename включен; в противном случае функция не выполняется. Включенный файл обрабатывается немедленно.

И вот теперь я думаю над словами "Включенный файл обрабатывается немедленно" и вроде бы все хорошо, но чувство тревоги не дает мне покоя  Веселый. А именно обрабатывается не само добавленное содержимое файла, а файл как таковой?
« Последнее редактирование: Июль 22, 2011, 18:48 от TaIRou » Записан
TaIRou
Гость
« Ответ #3 : Июль 25, 2011, 23:14 »

Ребят, собираю приложение в статике (надо), структура проекта предполагает наличие библиотек, которые будут предоставлять некоторые функции другим библиотекам, а уже те, в свою очередь, - конечному приложению. Причем цепочка может состоять из большего, чем 3, числа звеньев.

Во вложении тестовый набросок проекта.
Это зло компонуется только тогда, когда явно добавляешь LIBS += -llib_second в main_app.pro.
А нафига мне такая зелибоба?

вот написано (большое спасибо за перевод):
http://doc.crossplatform.ru/qt/4.7.x/qmake-environment-reference.html#libdepend
это ведь то что нужно?

в директории Qt/lib лежат аналогичные файлы зависимостей, ничего вроде особенного в них нет.
Чего не собирается то? Рад любой критике и предложениям конечно же.

(новый топик не стартовал, ибо решил, что всё выше изложенное умещается в контекст использования *.prl)
Записан
Fess
Гость
« Ответ #4 : Июль 26, 2011, 05:40 »

Такое ощущение, что prl файлы не находятся qmake, либо она все же не желает их использовать.
Может стоит собрать проект с расположением всех файлов "по умолчанию", или убрать из имени библиотек префикс lib
Как вариант, можно сделать так:

main.pro:
include(1lib.pri)

1lib.pri:
LIBS += -l1lib
include(2lib.pri)

2lib.pri
LIBS += -l2lib
include(...)
Записан
TaIRou
Гость
« Ответ #5 : Июль 27, 2011, 00:24 »

Такое ощущение, что prl файлы не находятся qmake, либо она все же не желает их использовать.

1. Видоизменил проектный файл сборки приложения (TEMPLATE = app) - main_app.pro следующим образом:
Код:
LIBS =
LIBS += -lbib_first
2. Собрал приложение (точнее то, что собралось, ибо библиотека bib_first не была найдена).
Код:
c:\qt\mingw\bin\..\lib\gcc\mingw32\3.4.2\..\..\..\..\mingw32\bin\ld.exe: cannot find -lbib_first
3. Сгенерированные *.prl сложил в Qt/lib: туда, где лежат *.prl Qt библиотек. Очистил проект от makefile'ов повторил сборку, приложение собралось без ошибок.
4. Да, кстати, TARGET'ы, имена директорий и *.pro файлов библиотек я поменял. (правда на результат это не повлияло: сборка по рецепту, приведенному выше, проходила до и после переименования).
5. Не использовал include(), пока рассматриваю это в качестве запасного варианта =/

Как я понял:
На первом прогоне сборки, после генерации *.prl и makefile'ов qmake'ом компоновщик, как и должно быть, не нашел bib_first потому что не знает, где ее искать.
На втором прогоне, на этапе генерации makefile'ов qmake при объявлении LIBS += -lbib_first, отправляется в поиск соответсвующих *.prl и находит их в Qt/lib, куда мы их вежливо положили (он и в первый раз отправлялся в поиск, но ни фига их не нашел). qmake генерирует соответсвующий makefile, и компоновка отрабатывает без ошибок.

До добавления в проектный файл приложения строки LIBS =, qmake находила библиотеку и успокаивалась (не пыталась искать *.prl пусть даже они и лежали в Qt/lib).

Если мои рассуждения, основанные на наблюдениях верны, у меня возникает два вопроса:
1. Каким образом явно указать qmake о необходимости искать *.prl в определенных пользователем местах?
2. Почему qmake при нахождении библиотеки пропускает этап просмотра соответсвующих библиотеке файлов зависимостей или изменяет механизм этого просмотра?
« Последнее редактирование: Июль 27, 2011, 00:29 от TaIRou » Записан
Fess
Гость
« Ответ #6 : Июль 27, 2011, 05:04 »

т.е. выходит, что теперь в .pro приложения не прописан путь к дополнительным библиотекам?
сторокой LIBS =  вы ее просто зачистили и в итоге LIBS содержит только -lbib_first.
Qt/lib включена в путь поиска по умолчанию средой, либо через PATH.
Где сейчас лежат сами bib_first.a и bib_second.a? В Qt/lib лежат только .prl?
Можете выложить обновленный проект?
Записан
TaIRou
Гость
« Ответ #7 : Июль 27, 2011, 12:36 »

Конечно можем выложить)
В Qt/lib лежат только *.prl, даже точнее сказать bib_first.prl, такого содержания:
Код:
QMAKE_PRL_BUILD_DIR = d:\projects\static_libs-build\bib_first
QMAKE_PRO_INPUT = bib_first.pro
QMAKE_PRL_TARGET = libbib_first
QMAKE_PRL_CONFIG = lex yacc warn_on uic resources incremental_off windows qt release link_prl copy_dir_files precompile_header static stl exceptions rtti staticlib create_prl static staticlib moc thread
QMAKE_PRL_LIBS = -LD:/projects/static_libs/lib -lbib_second -lQtGui -lgdi32 -lcomdlg32 -loleaut32 -limm32 -lwinmm -lwinspool -lmsimg32 -lQtCore -lkernel32 -luser32 -lshell32 -luuid -lole32 -ladvapi32 -lws2_32

в LIBS main_app.pro, содержиться только одна запись, о чем сужу по выводу for(i,LIBS):message($$i) из pro-файла приложения Project MESSAGE: -lbib_first
Записан
Fess
Гость
« Ответ #8 : Июль 28, 2011, 06:25 »

Поковырявшись некоторое время с исходниками могу отметить следующее:
prl файлы должны подхватываться еще до генерации MakeFile-ов. Если все проходит удачно, то появляются строчки:
Makefile: c:/QtSDK/Desktop/Qt/4.7.3/mingw/lib/bib_first.prl и в LIBS добавляется -lbib_second
prl файлы находятся только в QTPATH/lib, но не в папках, указанных через LIBS
CONFIG += link_prl не имеет эффекта (он включен по умолчанию)
В разных интернетах оч. мало инфы по теме, например тут. Но нигде не видел решения. Зато висят баги: 1, 2.
Возможно, эта фича qmake вообще не работает правильно на настоящий момент. Возможно, можно как-то еще указать qmake где искать prl файлы.
Вижу только два выхода - либо использовать другой подход для достижения того же результата, либо копировать prl в QTDIR/lib
ЗЫ: неплохо бы адресовать этот вопрос самим троллям, пусть просветлят в чем магия create_prl & link_prl Веселый
Записан
Akon
Гость
« Ответ #9 : Май 31, 2012, 20:17 »

Могу добавить (в примерах Database - статическая либа, тянущая внешние зависимости):

Вот так не работает:
Код:
LIBS += -L$$ROOT_DIR/bin -lDatabase

А вот так работает:
Код:
QMAKE_LIBDIR += $$ROOT_DIR/bin
LIBS += -L$$ROOT_DIR/bin -lDatabase

Мля
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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