Как заставить 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 и использовать отладчик, чтобы убедиться, что:
a) Существует проект Lib/DLL, в котором TARGET (используется.lib, а не.dll) используется в строке ссылки другого проекта в вашем решении (вы можете изменить строку ссылки с помощью LIBS).
б) Существует проект 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 будет генерировать зависимость, когда имя вашей библиотеки будет 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.