Как установить первый проект после сборки в шаблоне вложенной папки qmake?

#qt #qt-creator #qmake

#qt #qt-creator #qmake

Вопрос:

У меня есть проект qtcreator с шаблоном вложенной папки. Папки выглядят следующим образом:

 mainProject/
   mainProject.pro
   staticLib/
      (bunch of .cpp and .h files)
      staticLib.pro
   testApp/
      main.cpp
      testApp.pro
  

И mainProject.pro файл:

 TEMPLATE = subdirs
CONFIG  = ordered

SUBDIRS = staticLib 
          testApp

testApp.depends = staticLib
  

Я хотел бы установить статическую библиотеку, поэтому я добавил опцию установки в staticLib.pro файл:

 headersDataFiles.path = $$LIBPATH/include
headersDataFiles.files = $$PWD/*.h
INSTALLS  = headersDataFiles

libraryFiles.path = $$LIBPATH/lib
Debug:libraryFiles.files = $$OUT_PWD/debug/*.a
Release:libraryFiles.files = $$OUT_PWD/release/*.a
INSTALLS  = libraryFiles
  

Проблема в том, что когда я создаю проект в Qtcreator, он создает статическую библиотеку, а затем приложение, не запустив сначала make install, поэтому сборка приложения завершается с ошибкой. И Qtcreator позволяет мне добавлять шаги сборки только после qmake_all (которые создают оба проекта без предварительной установки библиотеки).

Итак, вопрос в том, могу ли я каким-либо образом создать staticLib project, установить его, а затем создать TestApp?

РЕДАКТИРОВАТЬ: Проект TestApp всегда можно связать с библиотекой из выходного каталога первого проекта. Но я хотел бы переместить файлы .a и headers в другую папку, чтобы сохранить проект организованным. Сбой сборки TestApp — это не проблема. Извините за неправильно понятое.

Комментарии:

1. Установка не требуется afaik для компиляции чего-либо со статическими библиотеками в зависимости. Похоже, у вас неправильная конфигурация testApp.pro — не могли бы вы также поделиться им? Вы пытались добавить статическую библиотеку в TestApp через Qt Creator?

2. Да, вы правы, установка не требуется. На самом деле это не установка в системе, что я хочу сделать, просто переместите сгенерированные заголовки .a и в другие папки проекта, чтобы сохранить мой проект организованным. Спасибо за ваш комментарий и извините за неправильно понятый, я отредактировал вопрос.

Ответ №1:

Мне не нравится идея добавления шагов в Qt creator (если, конечно, это не единственный способ), поскольку они не являются постоянными в разных средах разработки AFAIK. Например, вам нужно будет добавлять этот шаг в Qt Creator каждый раз, когда вы загружаете / клонируете код из репозитория на другой машине.

Мы сделали это в Windows (однако это должно работать и для других платформ) с помощью QMAKE_POST_LINK и $$QMAKE_COPY (предварительно определите команду кроссплатформенного копирования qmake):

 FILES_TO_COPY = $$DESTDIR/staticLib.a <path to your header1> <path to your header2>
  

или, если вы предпочитаете:

 FILES_TO_COPY = $$DESTDIR/staticLib.a
FILES_TO_COPY  = <path to your header1>
FILES_TO_COPY  = <path to your header2>
  

Вы можете использовать переменные, такие как $$PWD , чтобы не жестко указывать полный путь к заголовкам, а затем

 DESTINATION_DIR = $$shell_quote($$shell_path("/put/it/here/"))
for (FILE, FILES_TO_COPY)
{
    FILE_PATH = $$shell_quote($$shell_path($$FILE))
    QMAKE_POST_LINK  = $$QMAKE_COPY $$FILE_PATH $$DESTINATION_DIR $$escape_expand(\n)
}
  

UPD: Если у вас есть все необходимые заголовки в одном каталоге, вы можете использовать QMAKE_COPY_DIR вместо QMAKE_COPY.

Кроме того, если вы планируете создавать его на одной конкретной платформе, вы могли бы опустить $$shel_quote/$$shell_path и просто написать правильные пути.

Ответ №2:

Или, если установка — это то, что вы хотите, вы можете просто добавить

 QMAKE_POST_LINK=$(MAKE) install
  

в ваш файл .pro