2017-02-15 17 views
0

У меня есть проект, построенный с помощью QtCreator. Myapp и staticlib mylib. Оба обрабатываются в рамках проекта шаблона SUBDIRS.Как вызвать внешний файл Makefile из файла проекта Qt .pro

TEMPLATE = subdirs 
SUBDIRS = \ 
     mylib \ 
     myapp 

CONFIG += ordered 
CONFIG += qt 

myapp.depends = mylib 

myapp также связан с mylib2, статическим Пбом построен отдельно outsideof рамок Qt.

Итак, где-то в myapp.pro Я:

# Paths to PGA libs and contrib 
INCLUDEPATH += ./include 
INCLUDEPATH += $$PWD/../mylib2/include 
... 
unix { 
    LIBS += "-L$$PWD/../mylib2/lib/" -lmylib2$${DBG} # DBG=d if debug mode 
... 
} 

Таким образом, все работает отлично. Я счастлив. Но для того, чтобы заставить его работать, мне нужно, чтобы убедиться, что mylib2 уже построен при построении myapp.

Что я хочу достичь, это сделать вызов makefile oy mylib2, когда он будет создан. то есть make -C /path/to/mylib2 -f mylib2.mak

Что нужно добавить в мой .pro-файл? Связано ли это с пользовательскими целями? Но как создать пользовательскую цель, автоматически созданную с помощью qmake target?

Z.

+0

Создайте файл qmake для mylib2, добавьте mylib2 в качестве проекта subdir. Укажите зависимость mylib от mylib2. Создание пользовательской цели в lib2: http://stackoverflow.com/questions/3776476/how-to-add-custom-targets-in-a-qmake-generated-makefile – AlexanderVX

+0

Александр, к сожалению, я не могу перенести обычные make-файлы в проект qmake файлы ... по техническим причинам. – Zyend

+0

Нет. Я имел в виду, что вы создадите файл .pro, который вызывает GNU make make makefile. – AlexanderVX

ответ

2

Может быть, я неправильно, но MyApp зависит от MyLib, но вы строите MyApp первым. Вы заставили Qt построить его заказ, но у вас есть myapp на первом месте.

Попробуйте сначала построить mylib.

CONFIG += ordered 
SUBDIRS = \ 
    mylib \ # must be first 
    myapp 

Edit: Я компиляции LibRaw в моем проекте, как этот

Это может быть в отдельном файле, как libraw.pri и вы можете добавить его в приложение проекта.

Комментарий: Это решение ожидает библиотеки, над которой вы не работаете. Он не будет перестраиваться при изменении любого файла в папке mylib2. Он будет основан на прогоне qmake. Не при создании проекта приложения или mylib.

# Build libraw 
!exists($$librawdir/bin/libraw.dll) { 
    system(cd $$librawdir && vcvarsall.bat amd64 && nmake Makefile.msvc) 
} 

Так вы версия может выглядеть следующим образом: Файл имя mylib2.pri

!exist (/path/to/mylib2/bin/mylib2.dll) { 
    system (make -C /path/to/mylib2 -f mylib2.mak) 
} 

Затем в вашем приложении про файл следует добавить этот файл как

include(mylib2.pri) 

Или вы можете добавить QMAKE_POST_TARGET как в проекте mylib, который запускается до проекта myapp.

 QMAKE_POST_LINK += make -C /path/to/mylib2 -f mylib2.mak & 

Это должно выполняться каждый раз, когда цель mylib строится.

+0

Действительно. Правильно. – Zyend

+1

У меня есть работа для работы с 'QMAKE_PRE_LINK' ... также обратите внимание, что конечная' & 'должна указывать дополнительную команду для запуска. Если в вашем QMAKE_PXXX_LINK есть только одна команда, вам не нужен амперсанд. – phyatt