问题 如何让qmake在Visual Studio .sln项目中生成“项目依赖项”


我有一个 QMAKE 构建一些库和一个依赖于它们的应用程序。使用子模板我能够让qmake输出一个.sln文件,它在VC2008中几乎符合我的喜好。虽然我已经以我所见过的各种方式指定了目标之间的依赖关系,但我最终在.sln文件中没有“项目依赖项”,我必须手动添加它们。

到目前为止,我已经尝试过了

CONFIG += ordered

正确的订购无济于事。

同样,更神秘的语法:

client.depends = core common

哪个也行不通。当我加载sln时,没有任何依赖项出现。


6434
2018-02-24 15:21


起源



答案:


CONFIG += ordered 和 target.depends = qmake的MSVC后端(解决方案生成器)不支持。回到2010年的Qt 4.7,文档没有提及,但在Qt 4.8中,开发人员已经更新了文档 于是 (见目标部分备注):

  • 。依靠 该子项目取决于指定的子项目。仅适用于 使用makefile的平台
  • 有序 Visual Studio不支持该选项。

但他们提供了一种解决方法(在此进行了讨论) 神秘的帖子),它仍然有效,甚至记录在同一个 目标 部分。太糟糕了,我不得不重建qmake并使用调试器来验证:

  1. a)有一个Lib / DLL项目,其中TARGET(使用.lib而不是.dll)用于解决方案中另一个项目的链接行(您可以使用LIBS修改链接行)。

    b)有一个Exe项目,其中TARGET用于解决方案中另一个项目的自定义构建步骤。

  2. 您不使用TARGET变量中的路径(使用DESTDIR / DLLDESTDIR),例如,TARGET = $(SOME_VARIABLE)/ myLib将无效。
  3. 如果你有一个特殊的libs位置,你指定-Lmy / library / path和LIBS + = mylib,而不只是使用LIBS + = my / library / path / mylib
  4. 在生成解决方案文件之前创建叶项目。 (您可以使用qmake的递归标志来执行此操作,例如“qmake -tp vc -r [yourproject.pro]”

基本上,当你的lib的目标名称时,qmake会产生依赖关系(yourlib.lib)等于最终应用程序的导入库之一(具有 LIBS += yourlib.lib)。 (看到 qmake的来源 将导入库添加为依赖项,以及a 稍远一点 将它们与项目目标名称进行比较的地方)

以下是在解决方案中生成依赖项的最小设置:

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

8
2018-03-14 10:28



非常感谢!最后我知道为什么heck依赖不起作用。 - Trass3r


答案:


CONFIG += ordered 和 target.depends = qmake的MSVC后端(解决方案生成器)不支持。回到2010年的Qt 4.7,文档没有提及,但在Qt 4.8中,开发人员已经更新了文档 于是 (见目标部分备注):

  • 。依靠 该子项目取决于指定的子项目。仅适用于 使用makefile的平台
  • 有序 Visual Studio不支持该选项。

但他们提供了一种解决方法(在此进行了讨论) 神秘的帖子),它仍然有效,甚至记录在同一个 目标 部分。太糟糕了,我不得不重建qmake并使用调试器来验证:

  1. a)有一个Lib / DLL项目,其中TARGET(使用.lib而不是.dll)用于解决方案中另一个项目的链接行(您可以使用LIBS修改链接行)。

    b)有一个Exe项目,其中TARGET用于解决方案中另一个项目的自定义构建步骤。

  2. 您不使用TARGET变量中的路径(使用DESTDIR / DLLDESTDIR),例如,TARGET = $(SOME_VARIABLE)/ myLib将无效。
  3. 如果你有一个特殊的libs位置,你指定-Lmy / library / path和LIBS + = mylib,而不只是使用LIBS + = my / library / path / mylib
  4. 在生成解决方案文件之前创建叶项目。 (您可以使用qmake的递归标志来执行此操作,例如“qmake -tp vc -r [yourproject.pro]”

基本上,当你的lib的目标名称时,qmake会产生依赖关系(yourlib.lib)等于最终应用程序的导入库之一(具有 LIBS += yourlib.lib)。 (看到 qmake的来源 将导入库添加为依赖项,以及a 稍远一点 将它们与项目目标名称进行比较的地方)

以下是在解决方案中生成依赖项的最小设置:

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

8
2018-03-14 10:28



非常感谢!最后我知道为什么heck依赖不起作用。 - Trass3r


从旧的邮件列表条目: http://lists.trolltech.com/qt-interest/2006-07/thread00238-0.html

它似乎试图找出哪些东西依赖于你。您是否能够在不手动输入项目依赖项的情况下从sln​​构建?


2
2018-02-24 15:45



我之前遇到过那个神秘的帖子。不确定信息是否是最新的。我当然尝试过使用它描述的简单和复杂的方法,但无济于事。如果不手动输入依赖项,我不能说构建真的有效,不行。它并没有完全被打破,但是有足够的问题,无论是明显的还是沉默的,总是值得手工添加deps。 - Michael Daum
您是否尝试使用QtCreator设置依赖项,然后创建sln?我没有在我面前使用我的Qt dev机器,所以当你在项目视图中指定依赖项时,我无法确定它放在pro文件中的内容。 - Adam W


我不是makefile中的wiz但是如果我是你,我会尝试通过编辑.pro文件,运行qmake然后查看MAKLEFILE中自动生成的结果来重新创建QtCreator中的依赖项。如果你想知道qmake是如何工作的,那么看看qt文档。


1
2018-02-24 15:27



我已经找到了我能找到的每一套文档。并做了大量的潜水源启动。作为旁注,makefile qmake生成似乎具有正确的依赖性。这是有问题的.sln。 - Michael Daum
@Michael:你的意思是单独的.vcproj文件(因为我相信这些依赖项存在的地方)。 - Travis Gockel
我会猜到这些东西存在于.sln文件中,因为这是知道所有不同项目的文件,并且可以将它们与我需要的依赖项连接起来。 - Michael Daum