Как заставить qmake генерировать "зависимости проекта" в проекте Visual Studio .sln - PullRequest
11 голосов
/ 24 февраля 2010

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

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

CONFIG += ordered

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

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

client.depends = core common

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

Ответы [ 3 ]

8 голосов
/ 14 марта 2013

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

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

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

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

    b) Существует проект 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
2 голосов
/ 24 февраля 2010

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

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

1 голос
/ 24 февраля 2010

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

...