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

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

Пока я пробовал

CONFIG += ordered

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

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

client.depends = core common

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

3 ответа

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам