Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Автоматическая сборка зависимостей
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Общие вопросы
QCasper
Есть один проект - статическая библиотека. Есть второй проект - исполняемый модуль. Модуль линкуется с библиотекой. Нужно, чтобы при запуске сборки модуля автоматически выполнялась сборка всех библиотек, от которых он зависит. На уровне файлов проекта естественно. То есть без всяких левых скриптов (это читай вручную опять же).
Litkevich Yuriy
Смотри QMAKE_EXTRA_TARGETS тут
QCasper
Цитата(Litkevich Yuriy @ 6.12.2009, 18:23) *
Смотри QMAKE_EXTRA_TARGETS тут


Там я смотрел, но у меня ничего не вышло. Буду очень принзнателен за готовый рабочий пример.
Litkevich Yuriy
Цитата(QCasper @ 6.12.2009, 21:38) *
Буду очень принзнателен за готовый рабочий пример.
Ну на пустом месте больше чем в асистенте я вряд ли напишу, приведи пример, своих зависимостей.
QCasper
Цитата(Litkevich Yuriy @ 6.12.2009, 18:46) *
Ну на пустом месте больше чем в асистенте я вряд ли напишу, приведи пример, своих зависимостей.


Вот файл проекта приложения. Статическая библиотека - rsync.

!include( ../../../config.pri ) {
    error(Run configure before building)
}

TEMPLATE = app
TARGET = rsynctester
DESTDIR = $$BINDIR/tests/$$TARGET
OBJECTS_DIR = $$TMPDIR/tests/$$TARGET
MOC_DIR = $$TMPDIR/tests/$$TARGET
RCC_DIR = $$TMPDIR/tests/$$TARGET
LIBS += -L"$$LIBDIR" -lrsync
INCLUDEPATH += $$INCLUDEDIR
CONFIG += $$BUILD_CONFIGURATION
depends = rsync

QMAKE_EXTRA_TARGETS += rsync

exists(stable.h) {
    CONFIG += precompile_header
    PRECOMPILED_HEADER = stable.h
}

# Input
HEADERS += widget.h
SOURCES += main.cpp widget.cpp

QCasper
Неужели никто не сталкивался? Или все пересобирают, зависимое от статкилибы приложение, вручную при каждом изменении этой либы? Скиньте, пожайлуста, свой файл проекта, кому удалось таки автоматизировать.
frg10
Я для gcc под Linux делал так:

unix:MYLIBSDIR = ../../lib/unix-x86

LIBS  += -L$$MYLIBSDIR

unix {
    PRE_TARGETDEPS += $$MYLIBSDIR/libVisualization.a \
                      $$MYLIBSDIR/libTransforms.a
}


Плохо, конечно, что все либы приходится руками прописывать, но зато работает :)
Kagami
Я в Qt Creator работаю. Он позволяет галочками отметить проекты, от которых зависит текущий. Они в свою очередь могут зависеть от других проектов и т.д.
QCasper
Это, как я понял, работает следующим образом. Если изменился сам файл либы (не исходники) до при команде make для приложения, последнее будет пересобрано. Это решает половину задачи. Вторая половина подразумевает, что команда make для приложения инициирует также и сборку всех либ, от которых оно зависит.

Но, в любом случае, за это тоже спасибо :)

Цитата(Kagami @ 7.12.2009, 14:50) *
Я в Qt Creator работаю. Он позволяет галочками отметить проекты, от которых зависит текущий. Они в свою очередь могут зависеть от других проектов и т.д.


Попробуйте следующее. Измените статиклибу, от которой зависит приложение и нажмите кнопку запуска. В результате у Вас либа пересоберётся, а приложение нет. В итоге изменений в запущенном приложении Вы не увидите. По крайней мере у меня не получилось. Галочку поставил. Qt Creator 1.3.0.

Впрочем, вкупе с вариантом, предложенным frg10, работать должно. Что само по себе уже неплохо.
Теперь бы вариант, работающий без Qt Creator, было бы совсем здорово :)
Kagami
Цитата(QCasper @ 7.12.2009, 14:57) *
Попробуйте следующее. Измените статиклибу, от которой зависит приложение и нажмите кнопку запуска. В результате у Вас либа пересоберётся, а приложение нет. В итоге изменений в запущенном приложении Вы не увидите. По крайней мере у меня не получилось. Галочку поставил. Qt Creator 1.3.0.

Для этого можно воспользоваться пунктом меню "Пересобрать все" :)
QCasper
Цитата(Kagami @ 7.12.2009, 15:06) *
Для этого можно воспользоваться пунктом меню "Пересобрать все" :)


Ну это конечно вариант, когда "всё" пересобирается за пару секунд. Но вот по 10 минут после каждого изменения ждать мне почему-то не хочется :)
frg10
Цитата(QCasper @ 7.12.2009, 14:57) *
Это, как я понял, работает следующим образом. Если изменился сам файл либы (не исходники) до при команде make для приложения, последнее будет пересобрано. Это решает половину задачи. Вторая половина подразумевает, что команда make для приложения инициирует также и сборку всех либ, от которых оно зависит.


У меня проект тоже состоит из нескольких либ и приложения. И собирается ровно так, как хочется: собираются сначала все либы, потом приложение. Если только одна либа изменилась, то пересобирается только она и приложение.
Структура проекта такая (названия подпроектов изменены):
source
    \lib1
    \lib2
    \mainapp


В каталоге source лежит главный проектный файл source.pro. Содержимое примерно такое:
TEMPLATE = subdirs

CONFIG += ordered

SUBDIRS = lib1 \
    lib2 \
    mainapp_bin

mainapp_bin.subdir = mainapp
mainapp_bin.depends = lib1 lib2


ordered говорит qmake-у чтобы проекты собирались именно в таком порядке.
mainapp_bin.depends = lib1 lib2 - говорит что главное приложение зависит от либ

Проекты либ не очень интересны, поэтому их не привожу.
А проект главного приложения вот такой (несущественные части пропущены):
TARGET = mainapp
TEMPLATE = app
...
SOURCES += main.cpp
...
unix:MYLIBSDIR = ../../lib/unix-x86

LIBS  += -L$$MYLIBSDIR

unix {
    PRE_TARGETDEPS += $$MYLIBSDIR/libVisualization.a \
                      $$MYLIBSDIR/libTransforms.a
}
....
LIBS += -lVisualization \
        -lTransforms
....


Если открыть проект в QtCreator, то откроются все подпроекты. Ну и из консоли все нормально собирается.
QCasper
А, ну так вся фишка в "главном проектном файле". А если обойтись только проектом приложения и только проектом либ?
frg10
Цитата(QCasper @ 7.12.2009, 15:41) *
А, ну так вся фишка в "главном проектном файле". А если обойтись только проектом приложения и только проектом либ?

ИМХО, никак не обойтись: как make должен узнать, что ваши либы и приложение вообще как-то связаны? Если несколько проектов связаны, то их нужно объединять. Это sln файлы в VisualStudio и subdirs проекты в Qt.
QCasper
Цитата(frg10 @ 7.12.2009, 16:08) *
ИМХО, никак не обойтись: как make должен узнать, что ваши либы и приложение вообще как-то связаны? Если несколько проектов связаны, то их нужно объединять. Это sln файлы в VisualStudio и subdirs проекты в Qt.


Ну почему нет. Ведь может же в файле проекта (.pro) приложения быть инструкция, которая, в свою очередь, запишет инструкцию в Makefile о том, что нужно пойти туда-то и там собрать.
Вообще говоря, до последнего момента я думал, что механизм, описанный здесь, это и реализует. Но, как выяснилось - нет. А что он реализует, я так и не понял. И, кстати, тоже хотел об этом спросить сведующих людей.
frg10
Цитата(QCasper @ 7.12.2009, 16:26) *
Ну почему нет. Ведь может же в файле проекта (.pro) приложения быть инструкция, которая, в свою очередь, запишет инструкцию в Makefile о том, что нужно пойти туда-то и там собрать.

Вообще, subdirs проект это и делает. А по поводу "запишет инструкцию в Makefile" есть абзац о том, как добавлять в мэйкфайл свои таржеты: Customizing Makefile Output. Но только там все руками делать надо, а в случае subdirs qmake сам все сделает.
QCasper
Цитата(frg10 @ 7.12.2009, 16:39) *
А по поводу "запишет инструкцию в Makefile" есть абзац о том, как добавлять в мэйкфайл свои таржеты: Customizing Makefile Output.


Вот, Вы уже третий, кто меня туда посылает :) Но у меня никак не получается, на основе лежащей там информации, решить эту задачу. Поэтому я и стал просить готовые файлы проектов.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.