Как заставить qmake генерировать "зависимости проекта" в проекте Visual Studio.sln

У меня есть qmake сборка из нескольких библиотек и приложение, которое зависит от них. Используя шаблон subdirs, я могу получить qmake для вывода файла .sln, который работает почти по своему вкусу в VC2008. Хотя я указывал зависимости между целями во всех отношениях, которые я видел, я не получаю никаких "зависимостей проекта" в файле .sln, и я должен добавить их вручную.

До сих пор я пробовал

CONFIG += ordered

с правильным упорядочением безрезультатно.

И аналогично более тайный синтаксис:

client.depends = core common

Что тоже не работает. Никаких зависимостей вообще не появляется при загрузке sln.

Ответ 1

Оба CONFIG += ordered и target.depends = не поддерживаются бэкендом qmake MSVC (генератором решений). Еще в 2010 году с Qt 4.7 вокруг, документы не упомянули об этом, но в Qt 4.8 разработчики обновили docs соответственно (см. Целевое примечания секции):

  • .depends Этот подпроект зависит от указанного подпроекта. Доступно только на платформах , которые используют make файлы.
  • Упорядоченная опция не поддерживается для Visual Studio.

Но они предоставили обходное решение (которое обсуждается в этом загадочном посту), и оно все еще действительное и даже документированное в том же target. Жаль, что мне пришлось перестроить qmake и использовать отладчик, чтобы убедиться, что:

  • a) Существует проект Lib/DLL, из которого TARGET (используется .lib, а не .dll) используется на линии ссылок другого проекта в вашем решении (вы можете изменить линию ссылок с помощью ЛИЭС).

    b) Существует проект Exe, из которого TARGET используется в пользовательском шаге сборки другого проекта в вашем решении.

  • Вы не используете пути в переменной TARGET (для этого используется DESTDIR/DLLDESTDIR), например TARGET = $(SOME_VARIABLE)/myLib, не будет работать.
  • Если у вас есть специальное место для ваших библиотек, вы указываете путь -Lmy/library/path и LIBS + = mylib вместо использования LIBS + = my/library/path/mylib
  • Проекты листьев создаются до создания файла решения. (Для этого можно использовать рекурсивный флаг для qmake, например "qmake -tp vc -r [yourproject.pro]"

В принципе, qmake будет генерировать зависимость, когда ваше целевое имя lib (yourlib.lib) равно одной из библиотек импорта окончательного приложения (имеющего LIBS += yourlib.lib). (Смотрите qmake source, где библиотеки импорта добавляются как зависимости, а немного далее, где они сравниваются с целевыми именами проекта)

Вот минимальная настройка, которая генерирует зависимости в решении:

solution.pro
  TEMPLATE = vcsubdirs
  SUBDIRS = main app

app/app.pro
  LIBS += main.lib

main/main.pro
  TARGET = main
  TEMPLATE = vclib

С ними, если вы запустите qmake -r -tp vc, вы получите явную зависимость в сгенерированном .sln:

GlobalSection(ProjectDependencies) = postSolution
    {E634D0EB-B004-3246-AADA-E383A376158F}.0 = {1BD6E999-63E6-36F5-99EE-1A650332198C}
EndGlobalSection

Ответ 2

Из старой записи списка рассылки: http://lists.trolltech.com/qt-interest/2006-07/thread00238-0.html

Похоже, что он пытается выяснить, какие вещи зависят от вас. Можете ли вы построить из sln без ввода зависимостей проекта вручную?

Ответ 3

Я не виз в make файлах, но если бы я был вами, я бы попытался воссоздать эту зависимость в QtCreator, отредактировав файл .pro, запустив qmake, а затем просмотрев автоматически сгенерированный результат в MAKLEFILE. Если вы хотите знать, как работает qmake, посмотрите на документацию qt.